在传统的C++中,枚举类型并非类型安全,它可视为整数,不同的枚举类型可直接进行比较,且不同类型的枚举值i名称不能相同,这时常给枚举值取名带来困扰.
C++11引入了枚举类(enumaration class),并使用enum class的语法进行声明. 枚举类是类型安全的,它不能被隐式转换为整数,也不能与整数进行比较,更不能对不同枚举类型的枚举值进行比较,但同一个枚举类中的枚举值可进行比较.
枚举类中的枚举值不能直接通过 << 进行输出,需显式的进行类型转换,转换成整数后方可,也可通过重载 << 运算符来进行输出,代码如下:
#include <QCoreApplication>
#include <iostream>
using namespace std;
enum class EWeekday : unsigned int
{
EMonday = 1,
ETuesday,
EWednesday,
EThursday,
EFriday,
};
template<typename T>
std::ostream& operator << (typename std::enable_if<std::is_enum<T>::value, std::ostream>::type& stream, const T& e)
{
return stream << static_cast<typename std::underlying_type<T>::type>(e);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
cout << EWeekday::EWednesday << endl;
if (EWeekday::ETuesday > EWeekday::EMonday)
{
cout << "Yes" << endl;
}
else
{
cout << "No" << endl;
}
return a.exec();
}
输出结果如下:
3
Yes