2017-02-08 157 views
7

是否可以在可變參數模板參數中混合類型和非類型?如果我要將std::array作爲參數T傳遞給此類,則需要爲數組和長度傳遞一個類型,但是我在下面嘗試的方式在遇到值時會導致錯誤,因爲它只是期望類型Types在可變參數模板參數中混合類型和非類型?

template < 
    template<class, std::size_t> class T, 
    class ... Types> 
class C { 

    T<Types...> storage; 
}; 

int main(){ 
    C<std::array, int, 3> c; 
} 

錯誤消息:

error: template argument for template type parameter must be a 
     type 
    Container<std::array, int, 3> c; 
          ^

有沒有辦法通過類型和值的可變參數方面?

回答

2

正如我所看到的,您可以對T類必須採用的參數的數量和類型進行硬編碼作爲模板參數。這裏你不需要可變參數模板。只是這樣做,而不是:

template < 
    template<class, std::size_t> class T, 
    class A, std::size_t N> 
class C { 

    T<A, N> storage; 
}; 

int main(){ 
    C<std::array, int, 3> c; // works! 
} 

如果您想使用可變參數模板,然後把它放在模板的模板參數太多:

template < 
    template<typename...> class T, 
    typename... Types> 
class C { 

    T<Types...> storage; 
}; 

如果你想使用該版本,但仍然想使用std::array ,您可以創建一個別名std::array已有大小:

template<typename T> 
using array3 = std::array<T, 3>; 

C<array3, int> c; 

另外,您還可以建立某種形式的模板模板別名是令y OU選擇尺寸:

template<std::size_t n> 
struct sized_array { 
    template<typename T> 
    using array = std::array<T, n>; 
}; 

C<sized_array<5>::array, int>; 
4

是否有可能做的類型和nontypes在可變參數模板參數混合?

不可以混合搭配。但是,因爲你可以用一個類型的值,但不是周圍的其他方式,你可以留在人間的類型:

template <template<class...> class T, class ... Types> 
class C {  
    T<Types...> storage; 
}; 

然後它只是一個讓std::array工作,只是類型的事:

template <class T, class N> 
using my_array = std::array<T, N::value>; 

template <size_t N> 
using size_ = std::integral_constant<size_t, N>; 

所以,你原來的例子就變成:

C<my_array, int, size_<3>> c;