我有:
enum ID
和std::vector<BlockData> DATA
用于抽象索引的枚举。 以及包含每个索引信息的数据。
应该可以执行以下操作:DATA[ID::AIR]
每个
DATA
元素都是常量,并且在编译时已知
class BlockData {
public:
int someData;
BlockData() = default;
explicit BlockData(int someData) : someData(someData) {};
};
namespace Blocks {
enum ID {
AIR = 0,
DIRT = 1,
};
std::vector<BlockData> DATA(2);
void init() {
Blocks::DATA[Blocks::ID::AIR] = BlockData{32};
Blocks::DATA[Blocks::ID::DIRT] = BlockData{6};
}
}
我可以直接初始化
DATA
向量内联,例如:
std::vector<BlockData> DATA(block1data, block2data);
但我想使用枚举来分配它们,以提高可读性,就像我在代码中所做的那样。问题是它需要一些初始化函数。是否可以在不调用初始化函数的情况下做到这一点?理想情况下,命名空间中不会出现与初始化相关的函数和其他数据。
我会使用内联 lambda 调用来避免将
init()
传播到命名空间之外:
namespace Blocks {
enum ID {
AIR = 0,
DIRT = 1,
};
auto DATA = [] {
std::vector<BlockData> DATA(2);
DATA[Blocks::ID::AIR] = BlockData{32};
DATA[Blocks::ID::DIRT] = BlockData{6};
return DATA;
}();
}