如何在C++;? 在我正在重写内部结构的C++库中,我有一些无符号整型变量,我想转换成枚举: enum InitType { INIT, NON_INIT };
我有一个这样的变量:如何在C++;? 在我正在重写内部结构的C++库中,我有一些无符号整型变量,我想转换成枚举: enum InitType { INIT, NON_INIT };,c++,enums,type-conversion,C++,Enums,Type Conversion,我有一个这样的变量: InitType InitVar; 从代码的另一部分调用该库,该部分的变量为纯整数: uint32_t UnsignedIntVar; 我想将从调用方传递到库内部枚举的未签名版本分配给: InitVar = UnsignedIntVar; 但是编译器不喜欢这样: error: invalid conversion from 'uint32_t' to 'InitType' InitVar = UnsignedIntVar ? Init : NonInit;
InitType InitVar;
从代码的另一部分调用该库,该部分的变量为纯整数:
uint32_t UnsignedIntVar;
我想将从调用方传递到库内部枚举的未签名版本分配给:
InitVar = UnsignedIntVar;
但是编译器不喜欢这样:
error: invalid conversion from 'uint32_t' to 'InitType'
InitVar = UnsignedIntVar ? Init : NonInit;
执行此转换的最干净方法是什么
以下是我的一些想法: 如果
enum
只有两个值,我可以这样做:
error: invalid conversion from 'uint32_t' to 'InitType'
InitVar = UnsignedIntVar ? Init : NonInit;
无论何时我想做这样的作业,这都是一大堆的写作
如果它有更多的值,我可以创建一个转换表:
InitType Uint2InitTypeConv = {INIT_0, INIT_1, INIT_2...};
其中INIT_x
只是枚举的名称。然后我可以使用表格进行翻译:
InitVar = Uint2InitTypeConv[UnsignedIntVar];
这看起来很干净。然而,我想我应该能够为此重载操作符=
,但我似乎无法做到这一点。这将很容易地封装我能想到的任何其他丑陋之处。您可以显式地转换为枚举:
如果整数没有与已知枚举值对应的值,这就是您的问题
这完全可以接受的典型情况是枚举上的循环:
enum ESomething { Default = 0, Something, SomeOtherThing };
for (int i = 0; i != 3; ++i)
{
ESomething e = ESomething(i);
// do something with "e"
}
无论何时我想做这样的作业,这都是一大堆的写作
是的,但是由于uint32\u t
的含义与enum
的含义不同,我还是会这么做的。正如他们在Python社区中所说,“显式优于隐式”。我不会执行强制转换,而表方法有一个缺点,即必须枚举所有uint32\t
值才能获得完全覆盖,这实际上是不可能的
为什么不引入一个具有适当名称的函数来进行转换呢?类似于
InitType init\u type(uint32\u t)
,作为开关实现?请将函数样式转换为static\u cast
@aschepler:如果您喜欢,可以将其视为构造函数调用:-)@NathanFellman:您的意思是如果您指定了一个未指定的值?嗯,程序中依赖于具有定义良好的值的枚举的任何部分都可能会表现出令人惊讶的行为。请注意,您可以实现相同的问题,但是,默认情况下初始化没有零的枚举:enum ESomething{A=1,B=2};艾索美辛e代码>一般来说你必须小心。有时我认为enum
是用于未定义的行为的。对于新手来说,完全没有检查是非常令人惊讶的,并且仍然设法抓住了专家。这是真的,除了外部变量恰好具有相同的含义。此时,我没有足够的带宽将外部变量的所有实例转换为新的枚举。