2014-10-16 54 views
0

我想要創建一個元函數,Append採用模板類型,並將N類型參數的數量T添加到模板,例如,如果我調用Append<2, int, std::tuple<>>我想獲得std::tuple<int, int>如何將模板參數重複附加到某個類型?

這裏是我試過:

#include <tuple>                 

template <int N, typename T, template <class> class Seq, typename... Args>  
struct Append;                 

template <int N, typename T, template <class> class Seq, typename... Args>  
struct Append<N, T, Seq<Args...>>            
{                    
    using type = Append<N-1, T, Seq<Args..., T>>::type;       
};                    

template <typename T, template<class> class Seq, typename... Args>    
struct Append<0, T, Seq<Args...>>            
{                    
    using type = Seq<Args...>;             
};                    

// create a big tuple with N number of "int" types in it       
using T = Append<2, int, std::tuple<>>::type;          

int main()                   
{                     
    return 0;                  
}    

然而,當我嘗試編譯此我得到:

error: type/value mismatch at argument 3 in template parameter list for ‘template class Seq, class ... Args> struct Append’

我缺少什麼?

+0

* error:模板模板參數的模板參數必須是類模板或類型別名模板*在'Seq > – chris 2014-10-16 23:07:25

回答

2

我會在下面解釋一些小錯誤。這工作:

#include <tuple>                 

template <int N, typename T, typename SeqWithArgs>  
struct Append;                 

template <int N, typename T, template <typename...> class Seq, typename... Args >  
struct Append<N, T, Seq<Args...> >            
{                    
    using type = typename Append<N-1, T, Seq<T,Args...> >::type;       
};                    

template <typename T, template<typename...> class Seq, typename... Args>    
struct Append<0, T, Seq<Args...> >            
{                    
    using type = Seq<Args...>;             
};                    

// create a big tuple with N number of "int" types in it       
using T = Append<2, int, std::tuple<> >::type;          

static_assert(std::is_same<T,std::tuple<int,int>>::value,"Didn't work"); 

int main()                   
{                     
    return 0;                  
} 

的一個問題是在你的非特化模板類:你希望它有三個參數,其中第三個實際上是一個類型,而不是一個模板類(tuple<>比較你的電話)。這是你得到錯誤的原因,因爲你傳遞了一個編譯器期望模板的類型。

然後,對於專業化,您現在想要推導出模板模板參數,因此將模板參數分爲SeqArgs這四個模板參數實際上是正確的。然而,它必須是一個可變模板類(不僅在你的問題中爲template <class> class Seq),否則,在第二次迭代中,一個接一個地添加模板參數將失敗。

然後,最後,您需要在從屬名稱Append<[...]>::type前面有一個typename