繁体   English   中英

如何在C ++中为枚举指定无符号整数?

[英]How can I assign an unsigned integer to an enum in C++?

在我正在重写的内部的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= ,但我似乎无法做到这一点。 这很容易包含我能提出的任何其他丑陋。

您可以显式转换为枚举:

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"
}
InitVar = UnsignedIntVar ? Init : NonInit;

这是我想做这样一个任务的时候写的很多东西。

是的,但由于uint32_t含义与你的enum含义不同,我还是会这样做。 正如他们在Python社区中所说的那样,“显性优于隐性”。 我不会进行演员表,并且表格方法的缺点是您必须枚举所有uint32_t值以获得完全覆盖,这实际上是不可能的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM