2016-06-19 20 views
5

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>::typestd::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

+0

Ne yazık ki 'X ' bir şablon atayamaz, bu yüzden 'HKT_t > 'std :: vector' için bir takma ad olamaz. –

cevap

1

en iyi seçenek sizin foo çağırmak için bir sarıcı işlevi oluşturmaktır söz :

foo<HKT<std::vector<int>>>(); 
+0

Kullanmak istediğimden biraz farklı. Güncellemeye bir göz atabilir misin? –

+0

@ZizhengTai Yani, uzmanlıktan ayrılmak mı istiyorsunuz? –

+0

Kısmen uzmanlık (ya da bu konuda uzmanlaşmış), ama ben biliyorum takma ad şablonları kısmen uzmanlaşmış olamaz ... –