Daha yüksek bir türdeki T<Us...>
gibi görünen bir türü diyelim. SomeType
(daha yüksek SomeType
türünde bir tür) için, T
parçasını (std::vector
) ayıklamak için tip özellikleri kullanmak istiyorum. Yani şimdi bir std::vector<Foo>
tanımlamak için HKT<SomeType>::type<Foo>
yapabilirsinizDaha yüksek türdeki türler için Alias şablonu
template<typename>
struct HKT;
template<template <typename...> class T, typename... Us>
struct HKT<T<Us...>> {
template<typename... Vs>
using type = T<Vs...>;
};
: Ben böyle bir şey yapabilirsiniz.
Ancak typename std::enable_if<T>::type
std::enable_if_t<T>
'a kısaltılabilir gibi ::type
bölümünden kurtulmaya çalışıyorum. Olsa bile emin değilim, çünkü benim durumumda HKT_t<SomeType>
(varsayarak) bir tür yerine bir diğer ad şablonu olacaktır. Ve kullanım HKT_t<SomeType><Foo>
gibi bir şey olurdu ... Sanırım bu gerçekten bir "takma ad şablonu".
Bunu yapmak istememin nedeni, şablon şablonu parametresi için argüman olarak kullanmaktır. Örneğin,
Bu mümkün mü?
template <class T>
void wrapper_foo() {
foo<T::template type>();
}
//to call foo
wrapper_foo<HKT<std::vector<int>>>();
Veya şablon parametresinin varsayılan değeri faydalanmak:
template<class T, template <class...> class TT = T::template type>
void foo() {
TT<float> t;
}
Artık sadece diyebiliriz chris olarak
Ne yazık ki 'X' bir şablon atayamaz, bu yüzden 'HKT_t > 'std :: vector' için bir takma ad olamaz. –