模板参数的"部分应用"

Art*_*syn 3 c++ templates boost-mpl

我有以下"主"模板:

template <
        template <typename> class S
    > struct TT { /*...*/ };
Run Code Online (Sandbox Code Playgroud)

和我想要使用的模板TT:

template <int N, typename T> struct S1 {};
Run Code Online (Sandbox Code Playgroud)

特别是,我想使用类似的东西

TT< S1<5> > t2; // "Invalid template arguments" here
Run Code Online (Sandbox Code Playgroud)

它是模板的一种部分应用.我知道Boost.MPL涉及这种东西.问题是我已经有一些使用TT和模板的代码了

template <typename T> struct S2 {}; // S3, S4…
Run Code Online (Sandbox Code Playgroud)

它被送到TT.

所以,问题是:我怎么能使用S1TT具有最小的修改现有的代码.如果必须使用Boost.MPL,请告诉我最合适的解决方案.

Naw*_*waz 8

定义一个派生自以下的类模板S1:

template <typename T> 
struct S11 : S1<5,T>
{
};
Run Code Online (Sandbox Code Playgroud)

然后使用S11,而不是S1:

TT< S11> t2;  //it is as if TT< S1<5> > t2
Run Code Online (Sandbox Code Playgroud)

工作代码:http://ideone.com/y2s7n


阅读你的评论,似乎你需要这个:

template<int N>
struct Magic
{
   template <typename T> 
   struct S11 : S1<N,T>
   {
   };
};

//Usage
TT<Magic<5>::S11> t2;
Run Code Online (Sandbox Code Playgroud)

魔术演示:http://ideone.com/4yxvK