std::array
là một chút lạ. Nó không có một hàm tạo do người dùng định nghĩa, vì vậy nó rất giống một cấu trúc đơn giản. Vì vậy std::array<float,2>
là giống như
struct two_floats {
float array[2];
};
Bởi vì điều này, nếu bạn khởi tạo một, bạn sẽ logic làm điều đó như thế này:
two_floats x = {{1,2}};
std::array<float,2> y = {{1,2}};
Các niềng răng bên ngoài là dành cho các struct chính nó, và niềng răng bên trong là cho các nội dung của cấu trúc.
Nó xảy ra để làm việc chỉ cung cấp một bộ niềng răng:
two_floats x = {1,2};
Nhưng điều này là do một nguyên tắc đặc biệt trong C++ cho phép niềng răng để được bỏ qua trong các trường hợp nhất định. Tương tự như cách bạn có thể khởi tạo một mảng hai chiều với chỉ một bộ niềng răng:
float x[2][2] = {1,2,3,4};
Và đây là những gì đang xảy ra khi bạn khởi phạm vi của bạn như thế này:
Range r({1, 2});
Đó là tương đương với
std::array<float,2> arg = {1,2}; // one set of braces omittted
Range r(arg);
Nhưng đó sẽ rõ ràng hơn được viết như sau:
std::array<float,2> arg = {{1,2}};
Range r(arg);
Điều tương tự cũng xảy ra khi khởi tạo Hộp. Nếu chúng ta một cách rõ ràng viết ra các khởi tạo nó sẽ trông như thế này:
std::array<float,2> box_arg1 = {{1,2}};
std::array<float,2> box_arg2 = {{3,4}};
std::array<float,2> box_arg3 = {{5,6}};
std::array<Range,3> box_args = {{box_arg1,box_arg2,box_arg3}};
Box b(box_args);
Vì vậy, nếu chúng ta thay initializers, chúng tôi nhận được:
Box b({{{{1,2}},{{3,4}},{{5,6}}}});
và làm việc. Nhưng nó khá xấu xí. Việc khởi tạo này quá phức tạp để cho phép các dấu ngoặc thừa thừa được bỏ qua ở đây, đó là vấn đề bạn đang gặp phải.
Một cách để giải quyết vấn đề này nhằm cung cấp thêm các nhà thầu có các thành phần mảng riêng lẻ.
class Range
{
public:
Range(float x,float y) : m_ends{x,y} { }
Range(std::array<float, 2> ends) : m_ends(ends) {}
private:
std::array<float, 2> m_ends;
};
class Box
{
public:
Box(Range x,Range y,Range z) : m_ranges{x,y,z} {}
Box(std::array<Range, 3> ranges) : m_ranges(ranges) {}
private:
std::array<Range, 3> m_ranges;
};
Và bây giờ bạn có thể khởi tạo Box của bạn như bạn muốn ban đầu:
Box b({{1,2}, {3,4}, {5,6}});
này hoạt động: 'Box b {{{{{1, 2}}, {{3,4}}, {{5,6}}}}} '. – user1887915