我对可变参数模板模板有疑问:
            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;
    }