它只能用于聚合(数组和某些类。与流行的看法相反,这也适用于许多非 Pod)。编写接受它们的构造函数是不可能的。
既然您将其标记为“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
然而,这样的初始化将默认构造数组,然后使用赋值运算符。如果您的目标是速度和安全(您会因太多初始化程序而出现编译时错误!),您还可以使用带有可变参数模板的普通构造函数。
不过,这可能比需要的更通用(通常一个初始化列表就完全足够了,特别是对于普通整数)。它受益于完美转发,因此可以将右值参数移动构造到数组元素中
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
这是一个艰难的选择!
Edit更正,最后一个也有效,因为我们没有创建构造函数explicit
,所以它可以使用复制构造函数Phenotype
, 搭建临时Phenotype
对象并将其复制到p3
。但这并不是我们真正希望的调用方式:)