我在C++11标准中没有发现任何表示不推荐使用无范围枚举的措辞,但从实用的角度来看,我想知道它们是否仍然有用。我团队中的很多人都养成了将无作用域枚举转换为有作用域枚举的习惯,但这引起了一些头痛:classfoo{public:enumMyEnum{One,Two,Three};};他们将其转换为:classfoo{public:enumclassMyEnum{One,Two,Three};};这意味着当使用这些枚举器时,它看起来像foo::MyEnum::One而不是foo::One。我一直在询问以下最佳实践:如果您转换为作用域枚举,请将其移出类并移至全局作用域或命名空间作用域(以提高
我想知道是否有任何巧妙的技巧可以安全地将整数转换为枚举。在您投票认为这是重复之前,我不是在问如何转换(inti;Enume=static_cast(i)很简单)。我问的是如何安全地执行此操作,验证结果值确实在枚举中。代码如下enumclassE{A=1,B=2};intmain(int,char**){inti=3;Ee=static_cast(i);}将编译(AFAIK)但是e将不包含枚举中的有效值。我想到的最好的方法是类似switch(i){case1:returnE::A;case2:returnE::B;default:throwinvalid_argument("");}哪个
我必须在不同的文件中用一些整数id写一些常量。例如:#defineMESSAGE_FIRST0在其他文件中:#defineMESSAGE_ANOTHER1有什么方法可以在编译时自动获取那个id?像这样的东西:#defineMESSAGE_AUTOGetNextId()我不能在这里使用枚举,因为这个指令将在不同的文件中。谢谢。附注海湾合作委员会,Linux 最佳答案 你可以做一个编译时计数器,继承和函数重载:templatestructCount{booldata[n];};templatestructCounter:publicCo
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:TemplateMetaprogramming-DifferenceBetweenUsingEnumHackandStaticConst请解释在下面的电源模板实现中使用的是什么enum。templatestructPow{//recursivecallandrecombination.enum{value=B*Pow::value};};templatestructPow{//''N==0''conditionoftermination.enum{value=1};};intquartic_of_three=
您好,我有以下代码:enum{a,b,c,d,...,z}abc;intmain(){intval=20;if(val==a||val==b||val==c||val==d.....||val==z){/*Dosomething*/}}有没有其他方法可以跳过OR操作,因为如果有1000个枚举成员,那么我们如何提前检查所有成员。请帮忙。 最佳答案 现代编译器应该能够优化这样的代码,就像你的情况一样,表达式的值在编译时是已知的。对于可读性和错误检查,我认为使用switch会更好:switch(val){casea:;caseb:;...
这就是我想要做的:enumMyEnum{ONE=1,TWO,THREE};templatevoidfunc(){cout();};它有效,但我收到警告:“警告C4482:使用了非标准扩展:限定名称中使用了枚举‘MyEnum’”如何在没有收到警告的情况下执行此操作 最佳答案 枚举在这里有点棘手。类型ONE和TWO将位于外部命名空间中。因此,将类型添加到名称会导致警告。您可以删除限定符templatevoidfunc(){cout因为这两个在外部命名空间中是已知的。您也可以将您的枚举移动到某种封闭结构。structEnumContain
抱歉,这个问题需要解释一下。我正在修复doxygen解析一些C++代码时的疏忽,我遇到了一个doxygen没有考虑的不寻常的极端情况。我有一个修复程序,但我想让它更通用,所以我需要一些解释。为了说明doxygen失败的情况,我将定义一个涉及辛普森一家的人为示例(因为这似乎很适合这类问题)。假设我们有以下枚举:enumsimpson{HOMER,MARGE,BART,LISA,MAGGIE};现在我们想将枚举值传递给一个方法(自然属于Simpsons类),如下所示:constchar*voicedBy(simpsonsimpson){switch(simpson){caseHOMER:r
我在很多地方都使用了C++随机数实用程序库。它可能不是很舒服(例如,没有用于任意分布的基类),但是-我已经学会了接受它。现在我碰巧需要从枚举类型中统一采样值。我知道,SO上已经有一个问题:generatingrandomenums但是,那个:假设所有枚举值都是连续的,即它不适用于enumColor{Red=1,Green=2,Blue=4}我们希望以1/3的概率对这三个值中的每一个进行采样。不提供std::uniform_distribution的功能,即它不适用于您传递给它的随机引擎等等。显然我不能使用std::uniform_int_distribution,如果仅出于上述原因1。
以下代码使用g++-std=c++11编译,但不使用clang++-std=c++11。问题在此上下文中,单冒号“运算符”的含义是什么?澄清/编辑:GCC如何解释代码?如何让GCC不编译这段代码?(这里假设Clang遵循C++标准。)是否有针对此的标志?代码用g++-std=c++11main.cpp和clang++-std=c++11main.cpp编译。我正在使用GCC4.8和Clang6.0.0(主干)。#include#includeenumDir{LEFT,RIGHT};intmain(intargc,char**argv){//Interestingline:Noticet
classA{public:enumclass{HELLO,WORLD};};知道了,在class中,声明一个简单的enum(而不是enumclass)是一个更好的主意,因为它已经使用class标识键入。但上面的语句仍然是一个有效的C++0x签名。现在如何访问外部未命名的enumclass?inti=A::HELLO;//error:‘HELLO’isnotamemberof‘A’ 最佳答案 实际上,这是无效的。C++0xFDIS说(9.2p1)Exceptwhenusedtodeclarefriends(11.3)ortointr