Nó chỉ có thể được thực hiện cho tổng hợp (mảng và các lớp nhất định. Trái ngược với niềm tin phổ biến, điều này làm việc cho nhiều nonpods quá). Viết một hàm tạo không cần đến chúng.
Vì bạn đã gắn thẻ nó là "C++ 0x", thì điều này là có thể. Từ ma thuật là "hàm tạo danh sách khởi tạo". Điều này giống như
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
Tuy nhiên, việc khởi tạo đó sẽ mặc định tạo mảng và sau đó sử dụng toán tử gán. Nếu bạn nhằm mục đích cho tốc độ và sự an toàn (bạn nhận được các lỗi thời gian biên dịch cho quá nhiều initializers!), Bạn cũng có thể sử dụng một constructor bình thường với một mẫu variadic.
Điều này có thể chung chung hơn mặc dù cần thiết (thường là một initializer_list hoàn toàn đủ, đặc biệt là cho số nguyên đơn giản). Nó có lợi từ việc chuyển tiếp hoàn hảo, để một đối số rvalue có thể được di chuyển được xây dựng thành một phần tử mảng
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
Đó là một lựa chọn khó!
Sửa Correction, người cuối cùng làm việc quá, như chúng ta đã không làm cho các nhà xây dựng explicit
, vì vậy nó có thể sử dụng các nhà xây dựng bản sao của Phenotype
, xây dựng một đối tượng tạm thời Phenotype
và sao chép nó sang p3
. Nhưng đó không phải là những gì chúng tôi thực sự muốn các cuộc gọi là :)
có thể trùng lặp [chúng ta có thể chuyển mảng làm đối số cho hàm theo cú pháp này, trong tiêu chuẩn C++ 0x sắp tới không?] (Http://stackoverflow.com/questions/3424727/can-we- pass-array-as-arguments-to-functions-by-this-syntax-under-coming-c0x) – kennytm