2

例如:

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

我如何实现这一目标?

4

5 回答 5

8

添加到语言中的全部目的enum class是使枚举具有强类型范围。这表示:

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

  • 你不能把它当作int ——强类型枚举不能与没有显式转换的整数类型进行比较。

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

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

to_integral这个答案中获取实现:它是一个通用实现,所以你不必假设或弄清楚底层类型MyEnum是什么。

或者,您可以定义operator==for MyEnum。确保它是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");

只是为了完整起见,我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);
}

希望有帮助。

于 2013-10-16T15:58:35.600 回答
2

您的代码有两个问题:

  1. static_assert接受两个参数
  2. 你不能比较Aand 0,因为:
    1. MyEnum不只是enum,而是class enum。所以,首先,你必须写MyEnum::A
    2. 您无法与 进行比较MyEnum::A0因为MyEnum它是一个强类型枚举。在比较之前,您必须将其转换为int

但是如果你使用的是强类型枚举,我猜,你不需要将它与ints 进行比较。

于 2013-10-16T15:55:39.690 回答
2

尝试通过枚举访问,并转换枚举值:

enum class MyEnum { A, B };
static_assert((int)MyEnum::A == 0 && (int)MyEnum::B == 1, "message");
于 2013-10-16T15:55:52.403 回答
2

你有四个问题。你需要

enum class MyEnum { A, B };
static_assert(MyEnum::A == MyEnum(0) && MyEnum::B == MyEnum(1), "invalid values");

修复了

  • 枚举值的范围(Avs. MyEnum::A
  • 将整数值正确转换为枚举,因此比较有效
  • 添加缺少的错误消息static_assert

第四个问题是什么?

您需要在 C++11 模式下编译(这是其他人所缺少的!)。添加-std=c++11到编译器的命令行。我怎么知道?由于您收到错误消息,这仅在以 C++03 模式编译时发生。

于 2013-10-16T16:09:31.537 回答
1

static_assert 有两个参数,第二个是断言失败时输出的字符串。

应该是这样的,

static_assert(A == 0 && B == 1, "Enum values are not as expected");
于 2013-10-16T15:50:33.087 回答