2017-03-15 113 views
10

有沒有什麼辦法可以用using關鍵字替代嵌套模板類?這樣如何使用可變參數包別名嵌套模板類

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; 
} 

這個答案template template alias to a nested template?東西說明這個辦法做到這一點,但將不再工作,如果參數包都是可變參數,因爲編譯器將不知道從哪裏開始,在哪裏結束類型列表。

+0

爲什麼你需要這樣的具體方式?你可以稍微改變代碼,並使用類似的代碼'Something_t :: Something2 ' – LmTinyToon

+0

@LmTinyToon它可能沒有它,但我只是想知道它是否是一件事。 – Curious

+3

@LmTinyToon因爲他很好奇......:P – 101010

回答

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

不是一個獨立的答案,而是一種除max66的回答是:

你可以有試圖此:

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

看起來真的不錯,在第一,d不是嗎?

問題呢,但是就可以與一個單一的模板參數:

Alias<int> a; 

哪一個是現在? Something<int>::Another<>Something<>::Another<int>?如果你有更多的參數,如何分配?沒有機會獲得有意義的解決方案。所以不,你不能直接做到這一點,你必須幫助自己與諸如max66提議的技巧...

+1

很確定OP知道這是行不通的。正如問題中所述...... – Barry

+0

他嘗試使用錯誤的語法(兩個模板參數列表) - 確定*該*無法工作。以上是現在正確的語法(與max66的anwwer相比),但仍然不能工作,因爲ambiguites ... – Aconcagua

相關問題