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_Template Specialization - Fatal编程技术网

C++ 为具有不同模板参数的模板部分专门化模板类

C++ 为具有不同模板参数的模板部分专门化模板类,c++,templates,template-specialization,C++,Templates,Template Specialization,如何让一个类模板接受另一个可能具有两个不同参数列表之一的类模板?即非类型参数或类型与非类型参数: template <int X> struct Foo1{}; template <typename T, int X> struct Foo2{}; 模板 结构Foo1{}; 模板 结构Foo2{}; 我希望能够将这些模板中的任何一个传递给我的模板(加上后续的模板)。我希望这能说明我的目的,尽管语法完全错误: template <typename T, int

如何让一个类模板接受另一个可能具有两个不同参数列表之一的类模板?即非类型参数或类型与非类型参数:

template <int X>
struct Foo1{};

template <typename T, int X>
struct Foo2{};
模板
结构Foo1{};
模板
结构Foo2{};
我希望能够将这些模板中的任何一个传递给我的模板(加上后续的模板)。我希望这能说明我的目的,尽管语法完全错误:

template <typename T, int X, class>
struct Magic; //Don't accept non template parameters

template <typename T, int X, class <int> class C>
struct Magic<T, X, C> {}; //Template non-type

template <typename T, int X, class <class, int> class C>
struct Magic<T, X, C> {}; //Template type and non-type
模板
结构魔法//不接受非模板参数
模板
结构魔法{}//模板非类型
模板
结构魔法{}//模板类型和非模板类型

我想不出一个方法来为这些编写专门化。如果这是不可能的,我可以让
Foo1
和所有类似的模板都有一个模板类型参数,它什么都不做(
template Foo1{};
),并记住这一点编写
Magic
,但是我希望有一个更优雅的解决方案。

您可以应用的一个解决方案是为每个不同的类模板的声明引入包装器,并根据包装器包装的内容专门化神奇的结构。最终,您只需要知道哪个包装器与哪个类模板相关联

template <int X>
struct Foo1{};

template <typename T, int X>
struct Foo2{};

template <template <int> class C> struct W1;

template <template <class, int> class C> struct W2;

template <typename T, int X, class>
struct Magic; //Don't accept non template parameters

template <typename T, int X, template <int> class C>
struct Magic<T, X, W1<C> > {}; //Template non-type

template <typename T, int X, template <class, int> class C>
struct Magic<T, X, W2<C> > {}; //Template type and non-type

int main()
{
    Magic<int, 1, W1<Foo1> > m1;
    Magic<int, 2, W2<Foo2> > m2;
}
模板
结构Foo1{};
模板
结构Foo2{};
模板结构W1;
模板结构W2;
模板
结构魔法//不接受非模板参数
模板
结构魔法{}//模板非类型
模板
结构魔法{}//模板类型和非模板类型
int main()
{
魔法m1;
魔幻m2;
}

我能想到的解决方案of@PiotrSkotnicki明亮的如果你想让它成为一个答案,这肯定回答了这个问题。