巨集定義方式 進行列舉型別和列舉型別的相互轉換
阿新 • • 發佈:2021-06-29
很多時候我們會有這樣的困擾:
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; }