Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “;部分应用”;对于模板参数_C++_Templates_Boost Mpl - Fatal编程技术网

C++ “;部分应用”;对于模板参数

C++ “;部分应用”;对于模板参数,c++,templates,boost-mpl,C++,Templates,Boost Mpl,我有以下“主”模板: template < template <typename> class S > struct TT { /*...*/ }; 特别是,我想使用 TT< S1<5> > t2; // "Invalid template arguments" here TTt2;//此处为“无效模板参数” 它是一种模板的局部应用程序。我知道Boost.MPL涉及这类内容。问题是我已经有了一些使用TT和模板的代码,比

我有以下“主”模板:

template <
        template <typename> class S
    > struct TT { /*...*/ };
特别是,我想使用

TT< S1<5> > t2; // "Invalid template arguments" here
TTt2;//此处为“无效模板参数”
它是一种模板的局部应用程序。我知道Boost.MPL涉及这类内容。问题是我已经有了一些使用TT和模板的代码,比如

template <typename T> struct S2 {}; // S3, S4…
模板结构S2{};//S3,S4…
它们被送入TT


因此,问题是:如何在对现有代码进行最小修改的情况下,将
S1
TT
结合使用。如果必须使用Boost.MPL,请向我展示最合适的解决方案。

将源自
S1
的类模板定义为:

template <typename T> 
struct S11 : S1<5,T>
{
};
TT< S11> t2;  //it is as if TT< S1<5> > t2
工作代码:


阅读您的评论,您似乎需要:

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

//Usage
TT<Magic<5>::S11> t2;
模板
结构魔法
{
模板
结构S11:S1
{
};
};
//用法
TT-t2;

魔术演示:

您还可以编写通用的部分应用程序工具:

模板
结构应用
{
模板
结构T:TT
{
};
};
或者,如果您希望应用程序的结果时间是原始模板的专门化,而不是派生类(派生类的),则类似于此:

模板
结构应用
{
模板
结构
{ 
typedef TTtype;
};
模板
使用T=typename _T::type;
};

模板结构TT{/*…*/}不是选项?
TTt2缺少S1的第二个参数。显然,这是一个彻底的大师。@moing谢谢,我已经考虑过这个选项,但TT确实有内部typedef(比如P),这实际上是一个“实现细节”TT用P指定S。在这一点上,我看不出如何让TT接受类型而不是至少有一个类型参数的模板。@AJG85显然提供第二个参数也不会使此编译-所以问题的本质…@Artem Pelenitsyn:参考Nawaz的答案嵌套模板是不必要的。您可以将默认的
int
参数添加到
S11
模板中,并在需要时将其传递给包装器。
template<int N>
struct Magic
{
   template <typename T> 
   struct S11 : S1<N,T>
   {
   };
};

//Usage
TT<Magic<5>::S11> t2;