gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:26:28 24 4
gpt4 key购买 nike

例如:

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

我如何实现这一点?

最佳答案

向语言添加enum class 的全部目的是使枚举强类型作用域。这意味着:

  • 您不能不加限定地只使用A。您必须使用MyEnum::A

  • 您不能像对待 int 一样对待它 — 强类型枚举不能与没有显式转换的整数类型进行比较。

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

static_assert(to_integral(MyEnum::A)== 0 && to_integral(MyEnum::B)==1, 
"your message");

并从this answer中获取to_integral的实现: 它是一个通用实现,因此您不必假设或弄清楚 MyEnum 的基础类型是什么。

或者,您可以为 MyEnum 定义 operator==。确保它是 constexpr:

constexpr bool operator==(MyEnum x, int y) { return to_integral(x) == y; }
constexpr bool operator==(int x, MyEnum y) { return y == x; }

现在你可以这样写了:

static_assert(MyEnum::A== 0 && MyEnum::B ==1, "your message");

为了完整起见,我从 my other answer 复制粘贴了 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);
}

希望对您有所帮助。

关于c++ - 如何静态断言枚举元素的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19407969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com