gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:36:04 27 4
gpt4 key购买 nike

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

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 来缩短此表示法关键字。

关于具有不同类型的非类型参数的 C++ 可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22674347/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com