Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++;? 在我正在重写内部结构的C++库中,我有一些无符号整型变量,我想转换成枚举: enum InitType { INIT, NON_INIT };_C++_Enums_Type Conversion - Fatal编程技术网

如何在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
是用于未定义的行为的。对于新手来说,完全没有检查是非常令人惊讶的,并且仍然设法抓住了专家。这是真的,除了外部变量恰好具有相同的含义。此时,我没有足够的带宽将外部变量的所有实例转换为新的枚举。