我想定义一个类,它接受一个非类型参数列表,可能是不同类型的。例如,以下内容应该有效:
Test<3, 4.5, 6> t;
如果所有参数都具有相同的类型,比如int
,我可以使用以下定义:
template<int... args>
class Test {
// ...
};
更具体地说,在我的特定用例中,有第二个类Base
,其中包含许多成员,我想传递Base
个成员指针。
Test<&Base::a, &Base::b>
如果Base::a
和Base::b
的公共类型为T
,那么我可以按如下方式定义Test
。
template<int Base::* ...args>
class Test {
//
};
如何定义这样的课程Test
?
答案 0 :(得分:5)
您可以通过以下方式完成此操作:
template <class... Types>
struct Wrapper
{
template <Types... args>
class Test {
// ...
};
};
请注意,标准不允许使用简单的符号template <class... Types, Types... args> class Test;
(参见[temp.param] 14.1 / 15段落。)
使用示例(请注意float
,double
和long 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
关键字缩短此表示法。