2017-03-15 42 views
10

İç içe geçmiş bir şablon sınıfını using anahtar sözcüğüyle eşleştirmenin bir yolu var mı? Buİç içe geçmiş bir şablon sınıfını variadic parametre paketleri ile eşleme nasıl yapılır

template <typename... Types> 
struct Something { 
    template <typename... TypesTwo> 
    struct Another {}; 
}; 

template <typename... Types> 
template <typename... TypesTwo> 
using Something_t = typename Something<Types...>::template Another<TypesTwo...>; 

int main() { 
    Something_t<int><double>{}; 
    return 0; 
} 

Bu cevap template template alias to a nested template? gibi bir şey yapmak için bir yol gösterir ama hem parametre paketleri variadic ise derleyici nerede nerede tip listeleri sonuna kadar başlayacak ve bilmiyor gibi bu artık, çalışacaktır. Eğer küpe (veya benzeri) sınıfı argümanlar olarak variadic tip listeleri sarar eğer ... istedi ama değil tam olarak ne

+0

Neden böyle özel bir yola ihtiyacınız var? Kodu biraz değiştirebilir ve benzer bir kod kullanabilirsiniz: "Something_t:: Something2 " – LmTinyToon

+0

@ LmTinyToon Onsuz yapmak mümkündür ama sadece bir şey olup olmadığını merak ediyorum. – Curious

+3

@LmTinyToon Meraklı biri ...: P – 101010

cevap

2

...

#include <tuple> 

template <typename ... Types> 
struct Something 
{ 
    template <typename ... TypesTwo> 
    struct Another {}; 
}; 

template <typename, typename> 
struct variadicWrapper; 

template <typename ... Ts1, typename ... Ts2> 
struct variadicWrapper<std::tuple<Ts1...>, std::tuple<Ts2...>> 
{ using type = typename Something<Ts1...>::template Another<Ts2...>; }; 

template <typename T1, typename T2> 
using Something_t = typename variadicWrapper<T1, T2>::type; 

int main() 
{ 
    Something_t<std::tuple<int>, std::tuple<double>>{}; 
} 
0

değil tek başına bir cevap, ama bir ilave etmek max66 cevabı:

template<typename ... TT, typename ... TTT> 
using Alias = typename Something<TT...>::Another<TTT...>; 

, ilk d gerçekten güzel görünüyor:

Sen olabilir bu çalıştı o değil mi?

Sorun daha sonra ise zaten tek bir şablon parametresi ile olacaktır: şimdi

Alias<int> a; 

olan hangisi? Something<int>::Another<> veya Something<>::Another<int>? Ve daha fazla parametreniz varsa, nasıl dağıtılır? Anlamlı bir çözüm bulma şansı yok. Öyleyse, bunu doğrudan yapamazsınız, max66 tarafından önerilen hileler ile kendinize yardım etmelisiniz ...

+1

Kesinlikle emin OP bunun işe yaramayacağını biliyor. Soruda belirtildiği gibi ... – Barry

+0

Kötü sözdizimi ile çalıştı (iki şablon parametre listesi) - tabii ki * bu işe yaramaz. Yukarıdaki doğru sözdizimi (max66'ın annesine kıyasla), ama yine de belirsizlikler nedeniyle işe yaramaz ... – Aconcagua