为具有不同模板参数的模板部分特化模板 class
Partially specialize template class for templates with different template parameters
如何让 class 模板接受另一个可能具有两个不同参数列表之一的 class 模板?即,一个非类型参数或一个类型和非类型参数:
template <int X>
struct Foo1{};
template <typename T, int X>
struct 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 <typename, int X> Foo1{};
) 并牢记这一点编写 Magic
, 但我希望有一个更优雅的解决方案。
您可以应用的一个解决方案是为每个不同的 class 模板声明引入包装器,并根据包装器包装的内容专门化神奇的结构。最后,您唯一需要知道的是哪个包装器与哪个 class 模板相关联。
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;
}
如何让 class 模板接受另一个可能具有两个不同参数列表之一的 class 模板?即,一个非类型参数或一个类型和非类型参数:
template <int X>
struct Foo1{};
template <typename T, int X>
struct 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 <typename, int X> Foo1{};
) 并牢记这一点编写 Magic
, 但我希望有一个更优雅的解决方案。
您可以应用的一个解决方案是为每个不同的 class 模板声明引入包装器,并根据包装器包装的内容专门化神奇的结构。最后,您唯一需要知道的是哪个包装器与哪个 class 模板相关联。
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;
}