如何enum class在C++ 11中输出a的值?在C++ 03中,它是这样的:
#include <iostream>
using namespace std;
enum A {
a = 1,
b = 69,
c= 666
};
int main () {
A a = A::c;
cout << a << endl;
}
Run Code Online (Sandbox Code Playgroud)
在c ++ 0x中,此代码无法编译
#include <iostream>
using namespace std;
enum class A {
a = 1,
b = 69,
c= 666
};
int main () {
A a = A::c;
cout << a << endl;
}
prog.cpp:13:11: error: cannot bind 'std::ostream' lvalue to 'std::basic_ostream<char>&&' …Run Code Online (Sandbox Code Playgroud) 我有一个包含枚举类的类.
class Shader {
public:
enum class Type {
Vertex = GL_VERTEX_SHADER,
Geometry = GL_GEOMETRY_SHADER,
Fragment = GL_FRAGMENT_SHADER
};
//...
Run Code Online (Sandbox Code Playgroud)
然后,当我在另一个类中实现以下代码时......
std::unordered_map<Shader::Type, Shader> shaders;
Run Code Online (Sandbox Code Playgroud)
...我收到编译错误.
...usr/lib/c++/v1/type_traits:770:38:
Implicit instantiation of undefined template 'std::__1::hash<Shader::Type>'
Run Code Online (Sandbox Code Playgroud)
导致错误的原因是什么?
是否有可能确定c ++的基数enum class:
enum class Example { A, B, C, D, E };
Run Code Online (Sandbox Code Playgroud)
sizeof但是,我尝试使用它返回枚举元素的大小.
sizeof(Example); // Returns 4 (on my architecture)
Run Code Online (Sandbox Code Playgroud)
有没有一种获得基数的标准方法(在我的例子中为5)?
通常,您可以使用以下语法为类定义强制转换:
class Test {
public:
explicit operator bool() { return false; }
};
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点或类似的东西enum class?
有没有办法指定一个默认的构造函数enum class?
我使用an enum class来指定一组允许库中特定数据类型的值:在这种情况下,它是Raspberry Pi的GPIO引脚ID号.它看起来像这样:
enum class PinID : int {N4 = 4, N17 = 17, /* ...etc... */ }
我这样做而不仅仅是使用一个int是确保代码是安全的:我可以static_assert(或者编译时确保 - 实际使用的方法对我来说并不重要)像有人没有这样的东西发出拼写错误(传递5而不是4等),我得到类型不匹配的自动错误消息等.
那么问题就是enum class有一个默认的构造函数 - 为了兼容性而enum我假设(因为它们具有相同的行为) - 初始化为enum class等效的0.在这种情况下,没有0价值.这意味着用户做出如下声明/定义:
PinID pid = PinID();
正在获取一个未明确定义的枚举器(当查看代码时甚至看起来"不存在"),并且可能导致运行时错误.这也意味着switch如果没有错误/默认情况,我就不可能使用明确定义的枚举器的值这样的技术- 这是我想要避免的,因为它会强迫我执行throw或执行类似返回a的操作boost::optional,这些操作不太适合静态分析.
我试图定义默认构造函数无济于事.我(拼命)试图定义一个共享名称的函数enum class,但这(不出所料)导致奇怪的编译器错误.我想保留铸的能力enum class到int,与所有N#统计员映射到它们各自的#,所以仅仅是"定义",比方说,N4 = 0是不可接受的; 这是为了简单和理智.
我想我的问题是双重的:有没有办法获得我使用后的静态安全性enum class?如果没有,还有什么其他可能性?我想要的是: …
在讨论了"枚举类"的增量和减量之后,我想问一下enum class类型的算术运算符的可能实现.
原始问题的示例:
enum class Colors { Black, Blue, White, END_OF_LIST };
// Special behavior for ++Colors
Colors& operator++( Colors &c ) {
c = static_cast<Colors>( static_cast<int>(c) + 1 );
if ( c == Colors::END_OF_LIST )
c = Colors::Black;
return c;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法实现算术运算符而不转换为已定义运算符的类型?我想不出任何东西,但是铸造困扰着我.演员通常表示出现了错误,并且必须有充分的理由让他们使用.我希望语言允许在不强制使用特定类型的情况下实现运算符.
2018年12月更新:其中一篇关于C++ 17的论文似乎至少部分地通过允许枚举类变量和基础类型之间的转换来解决这个问题:http://www.open-std.org/jtc1/sc22/wg21/文档/文件/ 2016/p0138r2.pdf
我有以下枚举规范:
enum class FaceDirection : int8
{
Down,
Up
};
Run Code Online (Sandbox Code Playgroud)
g ++ 4.8.1给出以下错误:
警告:scoped枚举的elaborated-type-specifier不能使用'class'关键字
是什么导致这个?
您可以使用枚举类实现标准符合(如n3242草案的17.5.2.1.3所述)类型安全位掩码吗?我读它的方式,类型T是一个位掩码,如果它支持|,&,^,〜,| =,&=和^ =运算符,你还可以做if(l&r)其中l和r是T类型.列表中缺少的是运算符!=和==并允许排序一个也可能想要重载<.
让操作员工作只是烦人的样板代码,但我不知道如何(l&r).至少下面的代码不能用GCC编译(除了极其危险,因为它允许错误的隐式转换为int):
enum class Foo{
operator bool(){
return (unsigned)*this;
}
};
Run Code Online (Sandbox Code Playgroud)
编辑:我现在肯定知道枚举类不能有成员.实际问题如果(l&r)仍然存在.
在C++ 11中,我们可以将强类型的枚举(enum class)强制转换为其基础类型.但似乎我们不能指向相同的指针:
enum class MyEnum : int {};
int main()
{
MyEnum me;
int iv = static_cast<int>(me); // works
int* ip = static_cast<int*>(&me); // "invalid static_cast"
}
Run Code Online (Sandbox Code Playgroud)
我试图理解为什么会这样:有什么关于枚举机制的东西让支持这个很难或没有意义吗?这是标准中的简单疏忽吗?别的什么?
在我看来,如果枚举类型真正构建在如上所述的整数类型之上,我们应该不仅能够投射值而且还能投射指针.我们仍然可以使用reinterpret_cast<int*>或者使用C风格的演员表,但这比我认为的更重要.
有没有办法将Q_DECLARE_METATYPE()与枚举类类型一起使用?我知道旧的枚举工作,但这些新的,强类型的?其他地方找不到关于这个问题的任何事情 我正在使用最新的Qt版本.
例:
enum Foo
{
A,
B,
C
};
Q_DECLARE_METATYPE(Foo)
QVariant var = Foo::A; // works fine
enum class Bar
{
X,
Y,
Z
};
Q_DECLARE_METATYPE(Bar)
QVariant var = Bar::X; // doesn't compile
Run Code Online (Sandbox Code Playgroud) c++ ×10
enum-class ×10
c++11 ×9
enums ×4
bit-fields ×1
bitmask ×1
cardinality ×1
g++ ×1
g++4.8 ×1
map ×1
qt ×1