草庐IT

java - 在 C++ 中模拟 Java 枚举

我一直在将一段时间前编写的应用程序从Java移植到C++。我很快意识到的一件事是Java丰富的枚举(在Java5中引入)远远优于C++中提供的枚举。C++0x和后来的C++11的“强类型枚举”(又名枚举类)仍然没有提供Java枚举提供的丰富性,我在这里找不到任何东西来模拟这个功能。我开始尝试模拟一些功能作为独立的类,我想要一些帮助来实现这个,如果合适的话可能使用模板(看起来应该有一个更通用的方法来实现这个).您会看到通过字符串名称查找特定枚举的能力实现得相当冗长——(这是对JavaENUM的valueOf(Stringstr)方法的模拟——它有效——但我确保它远非最佳。我实现Enum实

c++ - C++11 中的最终枚举类

我只是好奇枚举类是否可以是最终的...因为编译器给我的结果是矛盾的。考虑代码:#includeenumclasssome_enumsfinal:char{a='a',b='b',c='c'};intmain(){some_enumsaa=some_enums::a;std::cout(aa)用VisualStudio2015编译器(http://rextester.com/l/cpp_online_compiler_visual)编译它可以工作...但是用clang(http://rextester.com/l/cpp_online_compiler_clang)编译它给我一个错误:s

c++ - 为什么 == 运算符重载枚举在 MSVC 中不明确

除了MSVC,以下代码在我检查过的所有编译器(clang、mingw、g++)上都能正常编译。enumclassFoo{BAR};booloperator==(Fooa,Foob){return(int)a&(int)b;}intmain(intargc,char*argv[]){Foo::BAR==Foo::BAR;return0;}MSVC失败并出现以下错误:>main.cpp(10):errorC2593:'operator=='isambiguous>main.cpp(3):note:couldbe'booloperator==(Foo,Foo)'>main.cpp(10):n

c++ - 使用 int 进行枚举类初始化

我在编程的时候发现了一些有趣的事情:enumclassFoo{FOO_THING,FOO_TOO};intmain(){Foofoo{1};//ItisOKFoofoo2(1);//Itisaninvalid}你能告诉我,为什么foo{1}对于编译器来说是可以的,而为什么foo2(1)是无效的?编译器GCC(g++(Ubuntu7.3.0-21ubuntu1~16.04)7.3.0)说:$g++-Wall-std=c++17foo.cpperror:cannotconvert‘int’to‘Foo’ininitializationFoofoo2(1);我真的很想知道底层机制。:)))编

c++ - 哪些枚举值在 C++14 中是未定义的行为,为什么?

标准中的脚注暗示任何枚举表达式值都是已定义的行为;为什么Clang的未定义行为sanitizer程序会标记超出范围的值?考虑以下程序:enumA{B=3,C=7};intmain(){Ad=static_cast(8);returnd+B;}theundefinedbehaviorsanitizer下的输出是:$clang++-5.0-fsanitize=undefined-ggdb3enum.cc&&./a.outenum.cc:5:10:runtimeerror:loadofvalue8,whichisnotavalidvaluefortype'A'请注意,错误不在static_c

c++ - 通过宏定义一个 Enum/Struct 需要什么?

我指的是来自开源项目tig的代码示例。这是一个很棒的工具!文件:tig.c我正在努力寻找定义request枚举的原因,如下所示:enumrequest{#defineREQ_GROUP(help)#defineREQ_(req,help)REQ_##req/*Offsetallrequeststoavoidconflictswithncursesgetchvalues.*/REQ_UNKNOWN=KEY_MAX+1,REQ_OFFSET,REQ_INFO,/*Internalrequests.*/REQ_JUMP_COMMIT,#undefREQ_GROUP#undefREQ_};甚至

c++ - 枚举变量的默认值是多少?

我对C++中的枚举变量有疑问:typeenmu{DAY1=1,DAY2,DAY3,DAY4}DAYS;voidmain(){DAYSdays;}那么天数的默认值是多少? 最佳答案 读取值是未初始化和未定义的行为。就像说intx;x在您初始化之前没有值。 关于c++-枚举变量的默认值是多少?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12037604/

c++ - 赋值运算符在 return 语句中意味着什么,比如 return t =...?

我有疑问,像我的代码示例中那样返回赋值表达式是什么意思?我有一个枚举,我已经覆盖了++:operator。所以在我的简短示例中可以在ligths之间切换-但代码中有一部分我不明白。代码编译并运行良好。代码:enumTraficlight{green,yellow,red};Traficlight&operator++(Traficlight&t){switch(t){casegreen:returnt=Traficlight::yellow;//Here>in;}“returnt=Traficlight::yellow”是什么意思,为什么我不能直接返回“交通灯::黄色”。

c++ - 如何使用枚举类值作为 for 循环的一部分?

我正在尝试通过遍历枚举Suit和Rank来创建一副纸牌(我知道没有很好的方法来遍历枚举,但我不知道看不到替代品)。为此,我在每个枚举的末尾添加了一个枚举器enum_count,其值表示枚举的长度和末尾。#includeusingnamespacestd;enumclassSuit:int{clubs,diamonds,hearts,spades,enum_count};enumclassRank:int{one,two,three,four,five,six,seven,eight,nine,ten,jack,queen,king,ace,enum_count};structCard{

c++ - 初始化枚举 C++

我创建了一个名为Types的枚举:enumTypes{Int,Double,String};当我创建一个对象并使用枚举允许值之一对其进行初始化时,出现以下错误:“错误:不允许类型名称”。Typesty=Types.Double;有什么想法吗? 最佳答案 在C++中,有两种不同类型的枚举-作用域枚举和非作用域枚举(前者是在C++11中引入的)。对于无范围的,枚举器的名称直接引入封闭范围。N3337§7.2/10Eachenum-nameandeachunscopedenumeratorisdeclaredinthescopethati