如何确保枚举枚举类中定义的每个案例,例如使用static_assert?

use*_*653 2 c++ enums c++11

假设一个 enum class

enum class MY_ENUM {FOO, BAR};
Run Code Online (Sandbox Code Playgroud)

和一个std::map包含枚举中每个元素的信息

map<MY_ENUM, MyInfoType> enumInfos;
Run Code Online (Sandbox Code Playgroud)

如何在编译时确保枚举的每个值在地图中都有一个条目?

我希望能够写出类似的东西(当然这段代码无效):

for (auto& elem : MY_ENUM) {
    static_assert(enumInfos.find(elem) != enumInfos.end(),
        "Error: Information for an element in MY_ENUM is missing.")
}
Run Code Online (Sandbox Code Playgroud)

这样的事情可能吗?

vso*_*tco 9

简答:不,这是不可能的.那是因为a std::map不能在编译时构建:它没有constexpr构造函数,并且有一个非平凡的析构函数.

至于为什么map以某种constexpr方式实现的挑战,可能是因为它使用默认分配器的动态内存分配.如果以某种方式可以构造一个编译时分配器(可能在C++中永远不会说永远不会),那么就有可能有一个constexpr映射.