C++ 进阶 使用enum class 而非 enum

   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;
   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水火汪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值