【发布时间】:2014-03-19 02:49:29
【问题描述】:
如何使用具有 n 个元素的列表初始化构造函数?
X x = {4, 5, 6, ...};
【问题讨论】:
标签: c++ list c++11 constructor
如何使用具有 n 个元素的列表初始化构造函数?
X x = {4, 5, 6, ...};
【问题讨论】:
标签: c++ list c++11 constructor
对于包含 n 个元素的列表,您需要使用 std::initializer_list。
Initializer_list 对象像数组一样自动构造 分配了 T 类型的元素,其中的每个元素 list 被复制初始化为数组中的相应元素, 使用任何必要的非缩小隐式转换。
举个例子:
#include <iostream>
#include <initializer_list>
#include <vector>
template<class T>
class X {
long unsigned int size;
std::vector<T> _elem;
public:
X(std::initializer_list<T> l): size{l.size()} {
for(auto x: l)
_elem.push_back(x);
}
void print() {
for(auto x: _elem)
std::cout << x << " ";
}
};
int main(int argc, char **argv) {
X<int> x = {4, 5, 10 ,8 ,6};
x.print();
return 0;
}
有关 std::initializer_list 的更多信息: http://www.cplusplus.com/reference/initializer_list/initializer_list/
【讨论】:
您是在问如何创建一个接受initializer_list 的构造函数?
#include <initializer_list>
class X {
public:
X(std::initializer_list<int> ilist);
};
【讨论】:
您可以定义一个所谓的 initializer-list 构造函数,并使用 std::initializer_list 类的迭代器来访问列表中的元素。
根据 C++ 标准
一个初始化列表构造函数,如果它的第一个参数是类型 std::initializer_list 或对可能 cv 限定的引用 某些类型 E 的 std::initializer_list,或者没有 其他参数,否则所有其他参数都有默认参数
例如
#include <iostream>
#include <vector>
#include <initializer_list>
class A
{
public:
A() = default;
A( std::initializer_list<int> l ) : v( l ) {}
std::vector<int> v;
};
int main()
{
A a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for ( int x : a.v ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
【讨论】: