带有不同类型的非类型形参的c++可变模板

C++ variadic template with non-type parameters of different types

本文关键字:c++ 形参 类型 同类型      更新时间:2023-10-16

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

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呢?

你可以这样做:

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

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

使用示例(注意float, doublelong 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关键字来缩短。