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 關注
- 623 瀏覽
添加回答
舉報