3 回答
TA贡献1820条经验 获得超10个赞
只能对聚合(数组和某些类。与流行的看法相反,这也适用于许多非荚)。编写带它们的构造函数是不可能的。
由于您将其标记为“ C ++ 0x”,因此这是可能的。神奇的词是“ initializer-list构造函数”。这就像
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
这是一个艰难的选择!
编辑更正,最后一个也可以,因为我们没有构造构造函数explicit,因此它可以使用的copy构造函数Phenotype,构造一个临时Phenotype对象并将其复制到p3。但这不是我们真正希望的电话:)
TA贡献1906条经验 获得超10个赞
在C ++ 0x中,您似乎可以为此创建一个构造函数。我自己对此没有经验,但是看起来它像称为Initializer list-constructor。
容器可以实现如下的初始化列表构造函数:
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 ...
};
TA贡献1810条经验 获得超5个赞
您需要使用std :: initializer_list模板类型。例:
#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};
}
- 3 回答
- 0 关注
- 588 浏览
添加回答
举报