文章目录
- 数量不定的模板参数
- auto
- ranged-base for
数量不定的模板参数
void print() {}
//... 表示参数的数量不定
template<typename T, typename...Types>
void print(const T&firstArg, const Types&...args) {cout << firstArg << endl;cout<<"args参数的个数为:"<<sizeof...(args)<<endl;//sizeof...(args)计算参数的个数print(args...);//此处firstArg是一个参数,args参数不定,调用print(args...)将args分为两组:一个参数和多个参数,进行递归//当args没有参数时,即0个参数时,调用 print()
}
//测试函数如下
int main()
{print(7.5,"hello",42,"nihao");system("pause");return 0;
}
输出结果为:
7.5
args参数的个数为:3
hello
args参数的个数为:2
42
args参数的个数为:1
nihao
args参数的个数为:0
…就是一个所谓的pack(包)
用于template parameters,就是template parameters pack(模板参数包)
用于function parameter types,就是function parameter types pack(函数参数类型包)
用于function parameters,就是function parameters pack(函数参数包)
auto
auto可以自动推导出数据的类型
list<string>c;
...
list<string>::iterator ite;
ite=find(c.begin(),c.end(),target);//auto版本如下:list<string>c;
...
auto ite=find(c.begin(),c.end(),target);
ranged-base for
语言规则:
for(decl:coll){statement
}
//decl是变量,coll是容器,将容器中的变量依次赋值给decl
示例1:
for(int i:{1,3,5,6}){cout<<i<<endl;
}
//输出结果为:
1
3
5
6
示例2:
vector<double>vec;
...
//值传递,不改变容器中的值
for(auto elem:vec){cout<<elem<<endl;
}
//引用传递,可改变容器中的值
for(auto& elem:vec){elem*=3;
}