在我正在重写的内部的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=
,但我似乎无法做到这一点。这很容易包含我能提出的任何其他丑陋。
答案 0 :(得分:12)
您可以转换为枚举显式:
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"
}
答案 1 :(得分:1)
InitVar = UnsignedIntVar ? Init : NonInit;
在我想做这样的任务时,这是很多写作。
是的,但由于uint32_t
的含义与您enum
的含义不同,我还是会这样做。正如他们在Python社区中所说的那样,“显性优于隐性”。我不会进行演员表,并且表格方法的缺点是您必须枚举所有uint32_t
值以获得完全覆盖,这实际上是不可能的。
为什么不引入具有适当名称的功能来进行转换?类似InitType init_type(uint32_t)
的内容,实现为switch
?