例如:
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)
我该如何实现这一目标?
添加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)
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
3193 次 |
| 最近记录: |