括号内的初始化列表构造函数

我有以下构造函数的类Phenotype:

Phenotype(uint8 init[NUM_ITEMS]); 

我可以像这样创build一个表型:

 uint8 data[] = {0,0,0,0,0}; Phenotype p(data); 

但是当我尝试创build一个像这样的时候,我得到一个错误:

 Phenotype p = {0,0,0,0,0}; 

输出:

 $ make g++ -Wall -g main.cpp -std=c++0x main.cpp: In function 'int main(int, char**)': main.cpp:109: error: no matching function for call to 'Phenotype::Phenotype(<brace-enclosed initializer list>)' main.cpp:37: note: candidates are: Phenotype::Phenotype(uint8*) 

该错误似乎表明有一种方法来定义一个构造函数,该构造函数接受一个大括号包含的初始化程序列表。 有谁知道这可能会怎么做?

它只能用于聚集(数组和特定的类),与stream行的观点相反,这也适用于许多非物理类)。 写一个构造函数是不可能的。

既然你把它标记为“C ++ 0x”,那么这是可能的。 神奇的单词是“初始化列表构造函数”。 这就像

 Phenotype(std::initializer_list<uint8> c) { assert(c.size() <= std::size(m_array)); std::copy(c.begin(), c.end(), m_array); } // used like Phenotype p1{1, 2, 3}; Phenotype p2({1, 3, 2}); // works too Phenotype p3(1, 2, 3); // doesn't work 

但是,这样的初始化将默认构造数组,然后使用赋值运算符。 如果您的目标是速度和安全性(编译时间错误太多的初始化程序!),您也可以使用带有可变参数模板的普通构造函数。

这可能比需要更通用(通常initializer_list完全足够,特别是对于普通的整数)。 它从完美的转发中受益,因此可以将一个右值参数构造成一个数组元素

 template<typename ...T> Phenotype(T&&...t):m_array{ std::forward<T>(t)... } { } // used like Phenotype p1{1, 2, 3}; Phenotype p2(1, 2, 3); // works too Phenotype p3({1, 2, 3}); // doesn't work 

这是一个艰难的select!

编辑修正,最后一个工作,因为我们没有使构造函数explicit ,所以它可以使用Phenotype的复制构造函数,构造一个临时的Phenotype对象,并将其复制到p3 。 但这不是我们真正想要的电话:)

在C ++ 0x看起来你可以为此创build一个构造函数。 我自己没有经验,但它看起来像它被称为初始化列表构造函数 。

一个容器可能像这样实现一个初始化程序列表构造函数:

 template<class E> class vector { public: vector (std::initializer_list<E> s) // initializer-list constructor { reserve(s.size()); // get the right amount of space uninitialized_copy(s.begin(), s.end(), elem); // initialize elements (in elem[0:s.size())) sz = s.size(); // set vector size } // ... as before ... }; 

你需要使用std :: initializer_list模板types。 例:

 #include <iostream> class X { public: X (std::initializer_list<int> list) { for (auto i = list.begin(); i != list.end(); i++) { std::cout << *i << std::endl; } } }; int main () { X x = {1,2,3,4,5}; }