目录
1.可变参数模板
1.1概念
有了可变参数模板,可以创建任意参数的函数模板和类模板。
cpp
template <class ...Args> // ...的位置,怎么规定就怎么用吧。。。。。。
int add(Args... arg)
{
return 0;
}
int main()
{
vector<int> v;
string s;
add(1, 3, 4, 5, 6);
add(1,'c', v,s);
return 0;
}

上述代码,直接生成解决方案是没有任何问题的。
1.2参数包的展开
cpp
template<class T>
void show(T t)
{
cout << t << endl;
}
template<class T, class ...Args>
void show(T t,Args... arg)
{
cout << t << endl;
show(arg...);
}
int main()
{
vector<int> v;
string s;
show(1, 3, 4, 5, 6);
cout << endl;
return 0;
}

这个也不知道是哪个神人想出来的,大概思路就是,[1,3,4,5,6],第一次调用show将[1]传给t,[3,4,5,6]传给arg,第二次递归将[3]传给t,[4,5,6]传给arg,依次类推就将所有参数解包。
2.stl的emplace接口
这个也是c++11之后新添加的功能,他支持万能引用,指出可变参数


插入一个新的元素在vector的末尾元素的后面,这个新的元素是使用args为参数构造的。
cpp
class date
{
public:
date(int year = 2000, int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{
cout<< "date(int year = 2000, int month = 1, int day = 1)" << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
vector<date> v;
v.push_back({1999,3,3});
//v.push_back(1999, 3, 3);错误做法
v.emplace_back(1999,3,3);
return 0;
}
v.push_back({1999,3,3});就是隐式类型转换,构造出一个date临时对象,在拷贝临时对象放入vector中。
v.emplace_back(1999,3,3);直接构造一个对象,放入vector中。
emplace接口对浅拷贝的类更有意义的,对于浅拷贝emplace可以减少一次拷贝构造。
但是对于深拷贝有移动构造的类,emplace减少一次移动构造,移动构造代价很小,效率提升不明显。
3.lambda****表达式

在c++98中,我们使用sort这类的接口,想要比叫大于或者是小于,必须自己写一个仿函数,非常的不人性,非常的麻烦。
cpp
template<class T>
class compare
{
public:
bool operator()(T left,T right)
{
return left > right;
}
};
int main()
{
compare<int> cmp;
vector<int>a = {1,2,4,5,6};
sort(a.begin(),a.end(),cmp);
for (auto num : a)
{
cout << num << endl;
}
return 0;
}
在c++11中我们可以使用lambda表达式,代替仿函数。
lambda表达式形式
[ capture-list] (parameters) mutable -> return-type { statement }
**capture-list:**捕捉列表,用于捕捉参数,捕捉的参数是原参数的拷贝
var\]:表示值传递方式捕捉变量var
\[=\]:表示值传递方式捕获所有父作用域中的变量(包括this)
\[\&var\]:表示引用传递捕捉变量var
\[\&\]:表示引用传递捕捉所有父作用域中的变量(包括this)
\[this\]:表示值传递方式捕捉当前的this指针
**(parameters):**参数列表,和函数的参数列表一样。
**mutable:**关键字,lambda默认是const,mutbable可以取消const。
**return-type:**返回值值,可写可不写,lambda表达式会自动推导。
**{ statement }:**函数体
### demo代码
```cpp
class goods
{
public:
goods(string name = "未知", int price = 0)
:_name(name)
,_price(price)
{}
string _name;
int _price;
};
int main()
{
vector