C++14中如何在成员初始化列表初始化自定义对象数组?
在C++14中实现DataLayers的灵活初始化
完全可以做到,不用给DataPoints加默认构造参数,把初始化逻辑放在DataLayers里。下面是两种可行方案:
方案一:利用编译期索引序列(灵活适配数组大小)
这种方法适合数组大小可能变动的场景,不需要手动写重复的初始化代码:
#include <vector> #include <array> #include <utility> struct DataPoint { int x = 0; int y = 0; }; class DataPoints { public: explicit DataPoints(size_t n) : points_(n) {}; private: size_t current_size_ = 0; std::vector<DataPoint> points_; }; // 辅助模板函数,批量生成DataPoints对象 template <size_t... Indices> std::array<DataPoints, sizeof...(Indices)> create_layers(size_t elem_size, std::index_sequence<Indices...>) { // 逗号表达式展开,每个索引对应构造一个DataPoints对象 return { (static_cast<void>(Indices), DataPoints(elem_size))... }; } class DataLayers { public: DataLayers() : layers_(create_layers(100000, std::make_index_sequence<10>{})) { } private: std::array<DataPoints, 10> layers_; };
原理
std::make_index_sequence<10>会生成编译期的0~9索引序列,用来标记数组的每个位置。- 参数包展开时,
(static_cast<void>(Indices), DataPoints(elem_size))里的逗号表达式会忽略索引值,只构造指定大小的DataPoints,最终生成10个符合要求的对象来初始化std::array。
方案二:直接初始化列表(简单直接)
如果数组大小固定为10,也可以直接写初始化列表,不用额外模板:
#include <vector> #include <array> struct DataPoint { int x = 0; int y = 0; }; class DataPoints { public: explicit DataPoints(size_t n) : points_(n) {}; private: size_t current_size_ = 0; std::vector<DataPoint> points_; }; class DataLayers { public: DataLayers() : layers_{DataPoints(100000), DataPoints(100000), DataPoints(100000), DataPoints(100000), DataPoints(100000), DataPoints(100000), DataPoints(100000), DataPoints(100000), DataPoints(100000), DataPoints(100000)} { } private: std::array<DataPoints, 10> layers_; };
为什么你之前的写法不行
std::array是聚合类型,必须逐个指定元素的初始化器,不能用单个值或对象直接初始化整个数组,这就是你原来的layers_(100000)或者layers(DataPoints(100000))报错的原因。
内容的提问来源于stack exchange,提问作者user2840470
相关产品推荐
相关产品推荐

