如何在C++中将无符号整数分配给枚举?

5
在我正在重写其内部的 C++ 库中,有一些无符号整数变量,我想将它们转换为枚举类型:
enum InitType {
    INIT,
    NON_INIT
};

我有一个这种类型的变量:

InitType InitVar;

这个库是从另一个代码部分调用的,该部分的变量是普通整数:

uint32_t UnsignedIntVar;

我希望将来自调用者的无符号版本分配给库内部枚举:

InitVar = UnsignedIntVar;

但编译器不喜欢这样:

error: invalid conversion from 'uint32_t' to 'InitType'

如何以最简洁的方式进行此转换?


以下是我提出的一些想法:

如果enum只有两个值,我可以这样做:

    InitVar = UnsignedIntVar ? Init : NonInit;

每次我想做这样的任务,都需要写很多文字。

如果有更多的值,我可以创建一个翻译表:

InitType Uint2InitTypeConv = {INIT_0, INIT_1, INIT_2...};

INIT_x只是枚举的名称。然后我可以使用表格进行翻译:

InitVar = Uint2InitTypeConv[UnsignedIntVar];

这看起来很简洁。不过,我认为我应该能够为此重载operator=,但我似乎做不对。那将轻松地封装我所能想到的任何其他丑陋的事情。

2个回答

13

你可以 明确地 转换为枚举类型:

InitType i = InitType(UnsignedIntvar);

如果整数没有对应于已知枚举值的值,那就是你的问题。

一个典型的情况是枚举循环中出现这种情况是完全可以接受的:

enum ESomething { Default = 0, Something, SomeOtherThing };
for (int i = 0; i != 3; ++i)
{
  ESomething e = ESomething(i);
  // do something with "e"
}

3
请将函数式转换更改为 static_cast - aschepler
1
@aschepler:如果你愿意,可以把它看作是构造函数的调用 :-) - Kerrek SB
@NathanFellman:你的意思是如果你分配了一个未指定的值?那么,任何依赖于您的枚举具有明确定义值的程序部分可能会表现出令人惊讶的行为。请注意,您也可以通过默认初始化没有零的枚举来实现相同的问题:enum ESomething { A = 1, B = 2 }; ESomething e;总的来说,你只需要小心谨慎。 - Kerrek SB
有时我认为 enum 就是为了未定义的行为而生的。对于新手来说,完全没有检查的情况非常令人惊讶,但即使是专家也会被它捕捉到。 - Matthieu M.

1
InitVar = UnsignedIntVar ? Init : NonInit;

每次我想做这样的任务时,都需要写很多东西。

是的,但由于 uint32_t 的含义与您的 enum 不同,我仍然会这样做。正如 Python 社区所说,“显式优于隐式”。我不会进行强制转换,而且表格方法的缺点是您必须枚举所有 uint32_t 值才能获得完全覆盖,这几乎是不可能的。

为什么不引入一个适当命名的函数来进行转换呢?像 InitType init_type(uint32_t) 这样的东西,实现为一个 switch 语句?


这是正确的,除了外部变量恰好具有相同的含义。我现在只是没有足够的带宽将所有外部变量的实例转换为新的枚举类型。 - Nathan Fellman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接