可変個引数テンプレートテンプレートに問題があります。
template <typename T> class A { };
template< template <typename> class T> class B { };
template <template <typename> class T, typename parm> class C { typedef T<parm> type; };
template <typename... types> class D { };
template <template <typename...> class T, typename ... parms> class E { typedef T<parms...> type; };
// How to pass list in list??
template < template <typename...> class ...T, ???>
class F
{
};
まず、型をテンプレートに渡します。問題ありません。
A<int> a; //ok
ここで、Bからインスタンスを作成したいのですが、テンプレートテンプレートパラメータを渡す方法がありません。
B<A> b; // ok, but no chance to submit <int> inside A!
したがって、パラメータリストを拡張する必要があります。
C<A, int> c; // ok, this transport int as parm into A
今、私は標準的な方法で可変個引数テンプレートで遊んでいます:
D<> d1; // ok
D<int, float, double> d2; //ok
可変個引数部分にパラメーターを渡すことも簡単です。
E<D> e1; //ok
E<D, double, float, int> e2; //ok
しかし、リストのリストが必要な場合、パラメーターリストをタイプのリストに渡すことができる構文が見つかりません。私の意図はこのようなものです。しかし、上記の例はそれB<A<int>> b;
がエラーであることも示しています!したがって、次の例は機能しませんでした:-(
F< D< int, float>, D< int>, D <float, float, float> > f;
私の目標は、テンプレートの特殊化を介してリストのリストを展開することです。ヒントはありますか?
問題を理解した後の私の解決策。ありがとう!
これで、次の例のように、可変個引数の可変個引数テンプレートテンプレートを展開できます。単純な問題は、単純な型ではなく、テンプレートクラスを待つことでした。時々、解決策はとても簡単かもしれません:-)
これが私の作業結果です。
template <typename ... > class D;
template <typename Head, typename... types>
class D<Head, types...>
{
public:
static void Do() { cout << "AnyType" << endl; D<types...>::Do(); }
};
template<>
class D<>
{
public:
static void Do() { cout << "End of D" << endl; }
};
template < typename ...T> class H;
template < typename Head, typename ...T>
class H<Head, T...>
{
public:
static void Do()
{
cout << "unroll H" << endl;
cout << "Subtype " << endl;
Head::Do();
H<T...>::Do();
}
};
template <>
class H<>
{
public:
static void Do() { cout << "End of H" << endl; }
};
int main()
{
H< D<int,int,int>, D<float, double, int> >::Do();
return 0;
}