无需调用初始化函数,以枚举索引初始化常量std::vector
解决方案
核心思路
把枚举、数据结构和常量数据全部封装到独立命名空间中,同时利用C++编译期初始化特性,完全避免手动调用初始化函数,既保留枚举索引的可读性,又不污染全局命名空间。
方案一:用constexpr std::array实现编译期静态初始化(推荐)
因为你的数据都是编译期已知常量,std::array比std::vector更合适——它是固定大小的静态容器,编译阶段就能完成初始化,无需动态内存分配,效率更高。
#include <array> // 封装所有相关内容到独立命名空间,隔离全局环境 namespace BlockDataRepo { // 定义你的BlockData结构体(根据实际需求调整字段) struct BlockData { int numeric_id; const char* name; bool is_solid; }; // 定义索引枚举,与数据数组的位置一一对应 enum ID { AIR, STONE, GRASS, WOOD, // 最后添加标记总数的枚举值,确保数组大小与枚举数量匹配 BLOCK_TOTAL }; // 编译期初始化的常量数组,直接与枚举索引绑定 constexpr std::array<BlockData, BLOCK_TOTAL> DATA = { { {0, "air", false}, // 对应ID::AIR {1, "stone", true}, // 对应ID::STONE {2, "grass", true}, // 对应ID::GRASS {3, "wood", true} // 对应ID::WOOD } }; } // 使用示例 int main() { // 通过命名空间限定访问,可读性清晰 const auto& air_block = BlockDataRepo::DATA[BlockDataRepo::ID::AIR]; printf("Air block name: %s\n", air_block.name); return 0; }
方案二:如果必须使用std::vector
如果因为业务需求一定要用vector,可以借助静态局部变量的特性——C++11及以后,静态局部变量的初始化是线程安全的,且只会执行一次,无需手动调用初始化函数。
#include <vector> namespace BlockDataRepo { struct BlockData { int numeric_id; const char* name; bool is_solid; }; enum ID { AIR, STONE, GRASS, WOOD, BLOCK_TOTAL }; // 通过函数返回vector的引用,第一次调用时自动完成初始化 const std::vector<BlockData>& get_block_data() { static const std::vector<BlockData> data = { {0, "air", false}, {1, "stone", true}, {2, "grass", true}, {3, "wood", true} }; return data; } } // 使用示例 int main() { const auto& block_data = BlockDataRepo::get_block_data(); const auto& stone_block = block_data[BlockDataRepo::ID::STONE]; printf("Stone is solid? %d\n", stone_block.is_solid); return 0; }
可选优化:强类型枚举增强安全性
如果担心枚举被隐式转换成整数导致错误,可以用enum class定义强类型枚举,使用时只需显式转换为size_t即可:
namespace BlockDataRepo { struct BlockData { /* ... */ }; // 强类型枚举,避免隐式转换 enum class ID { AIR, STONE, GRASS, WOOD, BLOCK_TOTAL }; constexpr std::array<BlockData, static_cast<size_t>(ID::BLOCK_TOTAL)> DATA = { { /* ... */ } }; } // 使用时显式转换索引 const auto& air_block = BlockDataRepo::DATA[static_cast<size_t>(BlockDataRepo::ID::AIR)];
内容的提问来源于stack exchange,提问作者Rostys
相关产品推荐
相关产品推荐

