我有可變參數模板模板的問題:模板的模板語法問題
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!
所以我必須擴展pa rameter列表:
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;
}
謝謝,你的回答打開了我的眼睛。我把我的最終解決方案放在我的問題上。希望這可以幫助別人。 – Klaus