宏定义方式 进行枚举类型和枚举类型的相互转换

很多时候我们会有这样的困扰:
1、如何在LOG中打印程序中的枚举类型
2、如何通过其他库内的枚举类型配置当前中的枚举类型

话不多说直接上代码:

1、枚举类型转字符串:

#include <iostream>
#include <string>

enum Type {
  SC_TYPE1,
  SC_TYPE2,
  SC_TYPE3,
  SC_TYPE4
};

std::string E2S(Type type) {
  switch(type) {
#define E2STR(t) \
  case Type::t: \
    return #t;                                                                                                                                                                                                     
  E2STR(SC_TYPE1)
  E2STR(SC_TYPE2)
  E2STR(SC_TYPE3)
  E2STR(SC_TYPE4)
#undef E2STR
  default:
    std::cout << "erro " << std::endl;
  }
  return ""; 
}



int main()
{
    std::cout << E2S(Type::SC_TYPE1) << std::endl;
    return 0;
}

很巧妙是吧, c++ 真的无所不能。。。。

2、枚举转枚举

同样的思路,直接上代码。

#include <iostream>
#include <string>

enum Type1 {
  SC_TYPE1,
  SC_TYPE2,
  SC_TYPE3,
  SC_TYPE4
};

enum Type2 {
  CC_SC_TYPE1,
  CC_SC_TYPE2,
  CC_SC_TYPE3,
  CC_SC_TYPE4,
  CC_INVALID
};

Type2 E2E(Type1 type1) {
  switch(type1) {
#define E2EE(t) \
  case Type1::t: \
    return CC_##t; 
  E2EE(SC_TYPE1)
  E2EE(SC_TYPE2)
  E2EE(SC_TYPE3)
  E2EE(SC_TYPE4)
#undef E2EE
  default:
    std::cout << "erro " << std::endl;
  }
  return Type2::CC_INVALID;
}



int main()
{
    std::cout << E2E(Type1::SC_TYPE2) << std::endl;                                                                                                                                                                
    std::cout << "Hello world" << std::endl;
    return 0;
}


posted on 2021-06-29 19:11  Smarc  阅读(330)  评论(0编辑  收藏  举报