c – 用于限制模板参数类型的类的变量模板部分特化

我有一个类Foo需要有可变数量的模板参数,但这些参数需要是某种泛型类型,而不是完全任意的.例如

template < int I, typename T> struct Arg;
using type1 = Foo<Arg<3, double>>;
using type2 = Foo<Arg<1, int>, Arg<7, float>, Arg<1, int>>;

我想知道实现这一目标的最佳方法是什么.我想我需要首先使用简单的可变参数模板

template < typename ...T >
class Foo;

从那里,我可以沿着递归的道路前进

template < int I, typename T, typename ...Others>
template Foo<Arg<I, T>, Others...>
{
    ...
};

但是将this answer读到另一个问题让我想知道我对可变参数模板的了解以及有时如何避免递归.

我的问题是,模板参数是否应该采用相对严格的格式这一事实能够实现Foo的部分特化,这种特殊化不会是递归的,并且可以有效地处理Foo< Arg< ...>形式的所有Foos ;,精氨酸< …>,…&GT ;?

最佳答案
这有效:

#include <iostream>

template <int i, typename T> struct Arg;

template <typename ...T>
class Foo;

template <int ...Is, typename ...Ts>
class Foo<Arg<Is, Ts>...>
{
public:
    static constexpr unsigned int N = sizeof...(Is);
};

int main()
{
    using type2 = Foo<Arg<1, int>, Arg<7, float>, Arg<1, int>>;
    std::cout << type2::N << "\n";
}

虽然在该表单中使用模板参数可能会或可能不容易或不方便,具体取决于您要对它们执行的操作.

转载注明原文:c – 用于限制模板参数类型的类的变量模板部分特化 - 代码日志