2017-02-08 8 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がテンプレートパラメータとして取らなければならないパラメータの数と種類を厳密にハードコードしています。ここにバリデーショナルテンプレートは必要ありません。あなたはそのバージョンを使用したいが、まだstd::arrayを使用したい場合は

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

    T<Types...> storage; 
}; 

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

あなたは可変引数テンプレートを使用したい場合は、あまりにもテンプレートテンプレートパラメータにそれを置く:だけではなく、これを行いますあなたはまた、Yを聞かせてテンプレートテンプレートエイリアスのいくつかの並べ替えを作成することができ、また

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

C<array3, int> c; 

:、あなたはすでにサイズがstd::arrayにエイリアスを作成することができます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; 
関連する問題