如何在编译期初始化my_class中member_array的idx与value成员?
编译期初始化带索引的std::array成员
可以实现需求:让member_array中每个元素的idx在编译期就被赋值为对应的索引(0到array_size-1),同时value初始化为空字符串。虽然std::string无法完全在编译期构造(涉及动态内存),但我们可以借助编译期索引序列来确定idx的值,在初始化阶段完成赋值。
实现方案(C++14及以上)
利用std::index_sequence和模板展开生成初始化列表,代码如下:
#include <array> #include <string> #include <utility> struct my_class { struct array_object { int idx; std::string value{}; }; static constexpr size_t array_size = 5; // 替换为你的编译期常量 private: // 编译期辅助函数,生成带索引的数组初始化列表 template<std::size_t... Is> static constexpr std::array<array_object, array_size> create_array(std::index_sequence<Is...>) { // 展开索引序列,为每个元素赋值对应idx,value默认空字符串 return {{array_object{static_cast<int>(Is), {}}...}}; } public: // 调用辅助函数完成初始化 std::array<array_object, array_size> member_array = create_array(std::make_index_sequence<array_size>{}); };
说明
std::make_index_sequence<array_size>会在编译期生成包含0,1,...,array_size-1的索引序列,完全是编译期计算的结果- 模板函数
create_array展开这个序列,为每个索引Is创建对应的array_object,idx被赋值为Is(编译期确定),value用默认构造的空字符串初始化 - 虽然
member_array本身不是constexpr对象(因为包含std::string),但每个元素的idx值在编译期就已确定,完全满足需求
可选:C++20 constexpr扩展(如果需要constexpr成员)
如果需要member_array是constexpr对象,C++20允许std::string的constexpr构造(有限制,比如不能在运行期修改),可以调整代码:
#include <array> #include <string> #include <utility> struct my_class { struct array_object { int idx; constexpr std::string value{}; // C++20起支持constexpr std::string }; static constexpr size_t array_size = 5; private: template<std::size_t... Is> static constexpr std::array<array_object, array_size> create_array(std::index_sequence<Is...>) { return {{array_object{static_cast<int>(Is), {}}...}}; } public: constexpr std::array<array_object, array_size> member_array = create_array(std::make_index_sequence<array_size>{}); };
这种情况下,整个member_array都是编译期初始化的,但要注意constexpr std::string的使用限制(比如不能在运行期修改其内容)。
内容的提问来源于stack exchange,提问作者TosinAl
相关产品推荐
相关产品推荐

