C++11 中,枚举的关键字为 enum class,即在 enum 后加 class,与 C++98 的 "plain" enum 区别如下:
enum class Color { red, green, blue };
enum Color { red, green, blue };
enum class 的优点
1: 防止命名空间污染
2:强制类型枚举、
3:前置声明,enum class 支持前置声明,即不用初始化枚举成员,声明一个枚举类型.
实验平台:ubutun 20
实验代码:
#include <iostream>
#include <tuple>
struct Base{};
struct Foo{
Base base;
int i;
};
struct Derived1:Base{
int i;
};
using UserInfo = std::tuple<std::string,std::string,std::size_t>;
enum class UserInfoFileds{uiName,uiEmail,uiReputation};
#if __cplusplus == 201103L
template<typename E>
constexpr typename std::underlying_type<E>::type
toUtype(E enumerator) noexcept
{
return static_cast<typename std::underlying_type<E>::type>(enumerator);
}
#elif __cplusplus == 201402L
template<typename E>
constexpr auto
toUtype(E enumerator) noexcept
{
return static_cast<std::underlying_type_t<E>>(enumerator);
}
#else
template<typename E>
constexpr auto
toUtype(E enumerator) noexcept
{
return static_cast<std::size_t>(enumerator);
}
#endif
int main()
{
static_assert(sizeof(Base) >=1);
static_assert(sizeof(Foo) == 2* sizeof(int));
static_assert(sizeof(Derived1) == sizeof(int));
UserInfo uInfo(std::make_tuple("111", "111",1));
//auto val = std::get<static_cast<std::size_t>(UserInfoFileds::uiName)>(uInfo);
auto val = std::get<toUtype(UserInfoFileds::uiName)>(uInfo);
std::cout << val << std::endl;
std::cout << __cplusplus << std::endl;
return 0;
}