繁体   English   中英

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

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

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

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段)。

使用示例(请注意, 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关键字来缩短此表示法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM