C++ 11(2.0)新特性 02(可变参数模板Variadic Templates)
程序员文章站
2024-03-14 11:28:28
...
可变参数模板说明
在使用C++标准库的时候,里面大量使用了模板函数;比如printf(…),Tuple(…);
在2.0之前,函数不支持可变参数模板;
可变参数模板的作用是方便递归可变数据;
代码示例
void print()
{
//cout << "empty" << endl;
}
//... 是可变参数声明包
//typename...是模板可变参数包
//Types... 是函数类型可变参数包
//args... 是函数参数包
// & 作用在名称右边,表示这是一个引用,别名
// & 的作用是提高程序的运行效率,&作用到的变量名不会开销内存
// 默认情况下,C++在没有声明&的时候会重新分配内存给变量返回
// const 约束传递的数据, const是相对于编译器来说
template <typename T, typename... Types>
void print(const T& firstArg, const Types&... args)
{
cout << firstArg << endl;
print(args...);
}
int main(int argc, char* argv[])
{
print(3.14, "hello", bitset<16>(297), 34);
}
当输入数据的时候,模板函数开始拆分成firstArg和可变参数包
第一次拆分成:3.14 + ("hello", bitset<16>(297), 34)
第一次输出3.14
,然后将后面的一包数据再次进行拆分,直到最后firstArg = 34
args... = NULL
最后调用print() { }
方法结束循环
实例应用
计算HashValue
代码运行过程解析:
需求是计算Customer的Hash值,第一次传入3个参数,在多个重载函数里面匹配到Types&... args
这个函数,
这个函数调用了hash_val(size_t, args...)
这个函数
标注2的函数一直在递归自我调用,直到参数变为hash_val(size_t, T& val)
的时候,
调用标注3号函数结束本次计算Hash值
Tuple标准库实现的递归