1. 程式人生 > 其它 >巨集定義方式 進行列舉型別和列舉型別的相互轉換

巨集定義方式 進行列舉型別和列舉型別的相互轉換

很多時候我們會有這樣的困擾:
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;
}