我基本上有两个问题可能是相关的,所以我将它们合二为一.
我们应该在传递给函数时通过引用或值传递C++ 11中的枚举类.它继承了原始类型,但它是通过的整个对象吗?因为枚举类是安全的;
enum class MyEnumClass : unsigned short {
Flag1 = 0,
Flag2 = 1,
Flag3 = 2,
Flag4 = 4,
};
Run Code Online (Sandbox Code Playgroud)
现在让我们说我们有功能sig
const char* findVal(const MyEnumClass& enumClass);
^
should this be by const ref? __|
Run Code Online (Sandbox Code Playgroud)
我的另一个问题是 -
SHOULD IT BE BY MOVE like (MyEnumClass&&) - I am still learning/understanding
move semantics and rvalue so I am not sure if move semantics are only for
constructors or can be for member or static funcs -
Run Code Online (Sandbox Code Playgroud) 为什么不是强类型C++ 0x枚举的实例可以相互比较?
更新:它们在gcc 4.6中具有可比性; 我不确定它是否适用于gcc 4.4.
我有一些枚举课
enum class Foo { A=1, B=18 , Z=42 };
Run Code Online (Sandbox Code Playgroud)
我想检查是否可以将某个整数转换为a Foo.这样做的理想方式是什么?这是用于运行时检查(在编译时尚不知道整数)
显然我可以用这种方式做到这一点(编写一个bool CheckEnum(Foo);带有大屁股开关的函数,除了默认情况下,所有情况都返回true),但我希望有一个更优雅的机制,避免这么多的写作.MPL或Boost.Preprocessor将是一个完全可以接受的解决方案,但其中一个我遗憾地知道很少
- 背景资料:
C++ 11中有一个类称为枚举类,您可以在其中存储变量.但是,我只看到类的类型为char:
enum class : char {
v1 = 'x', v2 = 'y'
};
Run Code Online (Sandbox Code Playgroud)
- 题:
有什么方法可以表达这个类型字符串的枚举类吗?
例如,
enum class : string{
v1 = "x", v2 = "y"
};
Run Code Online (Sandbox Code Playgroud)
- 我的想法:
我尝试使用它,但是我遇到了错误,我不确定我是否做得对.我想使用字符串的原因是它们能够同时保存多个字符,因此它对我的代码更有用.
我有一个事件处理程序类,它使用模板参数来设置事件类型。我想将这些事件类型强制为一字节大小的枚举类。针对大小的静态断言不是问题,但我无法在网上找到有关如何静态区分enum和enum class 的信息。
我现在的解决方案是使用C++ 前端实现语法扩展来断言枚举,然后断言正确的大小。在大多数平台上这是有效的,因为枚举使用int类型(通常大于一个字节)。
但这会导致稍微误导性的错误消息。我喜欢彻底。
我可以做哪些检查来传递类枚举,但会因常规的旧枚举而失败?
我不能使用type_traits,因为我使用的编译器(avr-gcc)不支持它。然而type_traits,当需要增加时,我会不断实施我自己的。因此,有关解决方案的任何提示type_traits仍然有用!
最小的例子:
// Event types
enum class tPass : uint8_t {};
enum class tFailSize : uint16_t {}; // Fail on size!
enum tFailType {}; // Currently fails on size, would like to fail on type!
// Event handler
template <typename TEvent>
class tEventHandler
{
static_assert(__is_enum(TEvent), "Must be class enum!"); // Doesn't really check for CLASS …Run Code Online (Sandbox Code Playgroud) 首先,我想要一个普通的枚举而不是基于位的枚举,因为不同枚举的数量将超出任何整数类型.我也想利用C++ 11的类型安全性enum class.要做到这一点,自然的选择是std::bitset,但我不知道如何将这两者结合在一起.
需要定制bitset吗?如何绕过这样一个类的实现?
为什么这段代码不能编译,我该怎么做才能编译?
#include <iostream>
using namespace std;
enum class myEnum : unsigned int
{
bar = 3
};
int main() {
// your code goes here
unsigned int v = 2;
switch(v)
{
case 2:
break;
case myEnum::bar:
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
ideone:
prog.cpp: In function 'int main()':
prog.cpp:18:16: error: could not convert 'bar' from 'myEnum' to 'unsigned int'
case myEnum::bar:
Run Code Online (Sandbox Code Playgroud)
未能在GCC和Clang中建立,在MSVC 2013中有效.
下面的代码在Xcode 5和Visual Studio 2013中编译和运行.我有兴趣尝试Codelite,但Codelite不会编译以下程序(因为我在我的项目中使用作用域枚举,所以是一个问题).据我所知,Codelite使用与Xcode相同的编译器.
代码对每个C++ 11有效吗?为什么Codelite无法编译它?
#include <iostream>
namespace abc
{
namespace xyz
{
enum class SampleEnum
{
SomeValue = 0,
SomeOtherValue = 1
};
}
}
int main(int argc, char **argv)
{
abc::xyz::SampleEnum e = abc::xyz::SampleEnum::SomeValue;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是Codelite的构建输出.如果它是乱码,它指向变量实例化中的单词"SampleEnum"并说"期望一个类或命名空间".
/bin/sh -c 'make -j8 -e -f Makefile'
----------Building project:[ ClangTest - Debug ]----------
codelite-cc /usr/bin/clang++ -c "/Users/xxx/Desktop/Test/ClangTest/main.cpp" -g -O0 -Wall -o ./Debug/main.cpp.o -I. -I.
/Users/xxx/Desktop/Test/ClangTest/main.cpp:7:8: warning: scoped enumerations are a C++11 extension [-Wc++11-extensions]
enum class SampleEnum
^
/Users/xxx/Desktop/Test/ClangTest/main.cpp:17:40: error: …Run Code Online (Sandbox Code Playgroud) 我有:
enum class orientation {
North,
East,
South,
West
};
Run Code Online (Sandbox Code Playgroud)
我想向左(北 => 西)和向右(西 => 北)旋转它的实例。
但我不想将它们转换为数字,因为它会损害可读性和意图,而且从最后一个数字跳到第一个再跳回很奇怪。
我想出了很多解决方案,但都有些蹩脚:(
int我喜欢使用枚举类,但有时我将它们用作标志,如果我想使用按位运算符,我必须不断地进行转换。有没有办法在不铸造的情况下做到这一点?我认为您无法为它们定义运算符?
如果我有采用枚举类的函数,我必须这样做吗?
enum class Flags { FLAG1, FLAG2, FLAG3};
void setFlags(Flags flags){}
int main()
{
setFlags((Flags)((int)Flags::FLAG1 | (int)Flags::FLAG2 | (int)Flags::FLAG3));
}
Run Code Online (Sandbox Code Playgroud) c++ ×10
enum-class ×10
c++11 ×7
enums ×2
c++17 ×1
c++20 ×1
codelite ×1
enumeration ×1
iteration ×1
std-bitset ×1