具有不同类型的非类型参数的C ++可变参数模板

时间:2014-03-26 22:26:31

标签: c++ templates c++11 variadic-templates

我想定义一个类,它接受一个非类型参数列表,可能是不同类型的。例如,以下内容应该有效:

Test<3, 4.5, 6> t;

如果所有参数都具有相同的类型,比如int,我可以使用以下定义:

template<int... args>
class Test {
  // ...
};

更具体地说,在我的特定用例中,有第二个类Base,其中包含许多成员,我想传递Base个成员指针。

Test<&Base::a, &Base::b>

如果Base::aBase::b的公共类型为T,那么我可以按如下方式定义Test

template<int Base::* ...args>
class Test {
  //
};

如何定义这样的课程Test

1 个答案:

答案 0 :(得分:5)

您可以通过以下方式完成此操作:

template <class... Types>
struct Wrapper
{
    template <Types... args>
    class Test {
        // ...
    };
};

请注意,标准不允许使用简单的符号template <class... Types, Types... args> class Test;(参见[temp.param] 14.1 / 15段落。)

使用示例(请注意floatdoublelong double常量不能是非类型模板参数):

Wrapper<int, char, unsigned>::Test<1, '2', 3U> t;

更具体的指向成员指针的情况可以类似地实现:

struct Base
{
    int a;
    float b;
    void c() {}
};

template <class... Types>
struct Wrapper
{
    template <Types Base::*... args>
    class Test {
        //
    };
};

使用示例:

Wrapper<int, float, void ()>::Test<&Base::a, &Base::b, &Base::c> t2;

可以使用可变参数宏和decltype关键字缩短此表示法。