c++ - 是否可以定义一个 C++11 可变参数类模板,其可变参数基数取决于整数模板参数?

标签 c++ templates c++11

很抱歉问了这个令人费解的问题,但基本上这个想法很简单。我有一个可变类模板:

template<class P1, class P2, class ... P3s>
class A 
{
    ...
};

我想要一个 A 类生成器,它接受一个整数模板参数 N 并实例化一个具有 N 个 P3s 参数的 A 类。喜欢:

template<class P1, class P2, class P3, int N>
class GenA : /* somehow */ : public A<P1, P2, /* N times */ P3, P3, ...>
{
    ...
};

所以用法是:

// Generates A<Class1, Class2, Class3, Class3, Class3>
GenA<Class1, Class2, Class3, 3> a; 

我已经尝试过使用编译时递归和部分特化来做到这一点

template <class P1, class P2, int N, class P3>
class GenA : public GenA<P1, P2, N-1, P3, P3>
{
    ...
}

template <class P1, class P2, int N, class ... P3s>
class GenA<P1, P2, 0, P3s ...> : public A<P1, P2, P3s, ...>
{
    ...
}

但是 C++11 不承认第二个模板是第一个模板的特化(因为它实际上是不同的)并且永远不会达到递归的基本情况(它不再提示太多递归层次)。有什么想法吗?

谢谢
通努兹

最佳答案

template<class P1, class P2, class... P3s>
class A {};

template<class... Ps>
struct TypeList {};

template<class P1, class P2, class P3, unsigned N, class P> struct GenHelp;

template<class P1, class P2, class P3, class... Ps>
struct GenHelp<P1, P2, P3, 0, TypeList<Ps...> >
{
   typedef A<P1, P2, Ps... > AType;
};

template<class P1, class P2, class P3, unsigned N, class... Ps>
struct GenHelp<P1, P2, P3, N, TypeList<Ps...> > : public GenHelp<P1, P2, P3, N-1, TypeList<P3, Ps...> >
{};

template<class P1, class P2, class P3, unsigned N>
class GenA : public GenHelp<P1, P2, P3, N, TypeList<> >::AType
{};

关于c++ - 是否可以定义一个 C++11 可变参数类模板,其可变参数基数取决于整数模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12816364/

相关文章:

使用模板元编程的 C++ 生成函数

c++ - 返回捕获局部变量的 lambda

c++ - std::mt19937 是否需要预热?

c++ - 如何实现is_STL_vector

c++ - 从源代码静态链接 GLEW 与 cmake

c++ - 如何将 -fix 选项添加到 .clang-tidy 文件?

c++ - *p++ += 2 定义明确吗?

c++ - 编译错误 : unresolved overloaded function type

c++ - c++ 中的接口(interface)类与类型

c++ - 在 Linux 中使用 gcc 4.1 编译的 C++03 应用程序中使用 C++11 共享库?