如何静态断言枚举元素的值?

qua*_*ant 2 c++

例如:

enum class MyEnum { A, B };
static_assert(A == 0 && B == 1); // error: expected constructor, destructor, or type conversion before '(' token
Run Code Online (Sandbox Code Playgroud)

我该如何实现这一目标?

Naw*_*waz 8

添加enum class到语言的整个目的是使枚举强类型作用域.这意味着:

  • 你不能A没有资格使用MyEnum::A.你必须使用.

  • 你不能这样对待int - 强类型的枚举不能与没有显式强制转换的整数类型进行比较.

所以你必须做这样的事情:

static_assert(to_integral(MyEnum::A)== 0 && to_integral(MyEnum::B)==1, 
                              "your message");
Run Code Online (Sandbox Code Playgroud)

to_integral这个答案中实现:它是一个通用实现,因此您不必假设或弄清楚底层类型MyEnum是什么.

另外,您也可以定义operator==MyEnum.确保它是constexpr:

constexpr bool operator==(MyEnum x, int y) { return to_integral(x) == y; }
constexpr bool operator==(int x, MyEnum y) { return y == x; }
Run Code Online (Sandbox Code Playgroud)

现在你可以这样写:

static_assert(MyEnum::A== 0 && MyEnum::B ==1, "your message");
Run Code Online (Sandbox Code Playgroud)

为了完整起见,我to_integral其他答案中复制粘贴执行:

#include <type_traits> //must include it

template<typename E>
constexpr auto to_integral(E e) -> typename std::underlying_type<E>::type 
{
   return static_cast<typename std::underlying_type<E>::type>(e);
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.