欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
C++ 11(2.0)新特性 02(可变参数模板Variadic Templates)
代码运行过程解析:
需求是计算Customer的Hash值,第一次传入3个参数,在多个重载函数里面匹配到Types&... args这个函数,
这个函数调用了hash_val(size_t, args...)这个函数
标注2的函数一直在递归自我调用,直到参数变为hash_val(size_t, T& val)的时候,
调用标注3号函数结束本次计算Hash值

Tuple标准库实现的递归
C++ 11(2.0)新特性 02(可变参数模板Variadic Templates)


相关标签: Game c++