initializer_list介绍
模板initializer_list是C++11新增的,可以使用初始化列表语法将STL容器初始化为一系列值,在使用 { }来进行初始化的时候,其实是调用了将 initializer_list < T > 作为参数的构造函数。
使用列表初始化可以让容器如同数组一般被初始化,除此以外,实现以std::initializer_list为形参
的构造函数也非常容易,这使自定义容器支持列表初始化也变得十分简单。
可变参数模板参数展开方法
递归的展开方法
要定义递归开始函数和结束函数,比较繁琐
void print(){}
template<typename T>
void print(T t)
{
cout << t << endl;
}
template<typename T, typename... Args>
void print(T t, Args... args)
{
print(t);
print(args...);
}
int main() {
print(1);
print(1, 2);
print(1, 2, 3);
}
使用initializer_list 配合 lambda和逗号表达式展开
template<typename... Args>
void print(Args... args)
{
std::initializer_list<int>{([&]{cout << args
<< endl; }(), 0)...};
}
使用初始化列表需要注意的事项
如果有一个类同时拥有满足列表初始化的构造函数,且其中一个是以 std::initializer_list 为参数,那么编译器将优先以 std::initializer_ list 为参数构造函数。例如:
std::map<std:: string, int> x8{ {"bear",4},{"cassowary",2}, {"tiger",7} }
内层括号和外层括号使用的构造函数是不一样的,内层的 {“bear”,4} 等隐式调用的是 std::pair(const T1& x, const T2& y) 构造函数,而外层调用的是std::map的构造函数 map(std::initializer_list<value_ type>init, const Allocator&)
指定初始化
struct Point3D {
int x;
int y;
int z;
};
Point3D p{ .z = 3 }; // x = 0, y = 0