带有不同类型的非类型形参的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::a
和Base::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
, 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
关键字来缩短。
相关文章:
- 使用mem_fun_ref if成员函数需要多个形参
- 通过类的模板形参特化成员模板结构
- 非类型引用形参/实参
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何确保迭代器模板形参与模板类的模板形参具有相同的数据类型
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- c++:候选模板被忽略:模板形参显式指定的参数无效
- c++中作为形参的指针
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 包含void*结构的函数的Const正确性和形参
- 传递boost::函数,该函数接受一个模板实参作为默认为NULL的形参
- 将右值引用形参强制转换为右值引用
- 给引用形参赋值使对象无效
- 当实参是初始化列表而形参是引用时,重载解析
- const整型模板形参的条件
- 使用作为模板形参提供的基类成员,不带限定符
- 模板类的不同返回类型取决于类的形参
- 模板形参有二义性:无法推断模板实参
- 是否有必要在定义中使用模板形参来引用同一个类?
- c++ std::find()和模板形参