只谈新东西
C++ 2.0 新特性 包括语言特性和标准库两个层面,后者以 头文件 形式呈现的。
标准库的东西全部都放在 名称空间 std 中。
目录
一、可变参数模板 Variadic template
创建可变参数模板,需要理解几个要点:
- 模板参数包 template<typename... Types>
- 函数参数包 void show_list(Types... args)
- 展开参数包 args...
- 递归 show_list(args...)
#include<iostream>
#include<string>
//definition for 1 parameters -- terminating call
template<typename T>
void show_list(T value)
{
std::cout << value << "\n";
};
//definition for more parameters
template<typename T, typename... Args> $$$$$$$$$$$
void show_list(T value, Args... args) $$$$$$$$$$$
{
std::cout<< value << " ";
show_list(args...);
}
int main()
{
int n = 14;
double x = 2.71828;
std:: string mr = "Mr. String objects!";
show_list(n,x);
show_list(x*x,'1',7,mr);
return 0;
}
模板参数包 Args 基本上是一个类型列表,函数参数包 args 基本上是一个值列表。
如需要知道当前函数参数包内的参数个数,可以使用 sizeof...(args)。
将省略号放在函数参数包名的右边,实现将参数包展开:show_list(args...) —> show_list(5,'L',0.5)。
展开与递归的核心理念是:对列表的第一项进行处理,再将余下的内容传递给递归调用,以此类推,直到列表为空。实现这种思想的主要语句如下:
- template<typename T,typename... Args>
- void show_list(T value,Args... args) {
- 。。。
- show_list(args...); }
每次迭代调用,只处理一个参数,参数列表就会减少一项,余下的类型和值,分别被包装到 Args 和 args 中&#