【C++】Enum::ParseとEnum::ToString
C#には Enum <-> 文字列の変換ができます
羨ましいですね~
C++でも似てるものが欲しい<(`^´)>
// こんな感じ #include <iostream> enum class Foo { X,Y,Z }; int main() { Foo foo = Enum::Parse<Foo>("Z"); std::string s = Enum::ToString(Foo::Z); }
書いてみた
// enum.h #pragma once #include <string> #include <boost/preprocessor.hpp> namespace Enum { // 宣言 template<class T> T Parse(const std::string&); template<class T> std::string ToString(T); } #define String2Enum(r,name,elem) if(in == BOOST_PP_STRINGIZE(elem)) out = name::elem; #define Enum2String(r,name,elem) case name::elem: return BOOST_PP_STRINGIZE(elem); #define REGIS_ENUM(name,seq)\ namespace Enum\ {\ inline void Conv(const std::string& in, name& out)\ {\ BOOST_PP_SEQ_FOR_EACH(String2Enum, name, seq)\ }\ inline std::string Conv(name in)\ {\ switch(in)\ {\ BOOST_PP_SEQ_FOR_EACH(Enum2String, name, seq)\ }\ return "";\ }\ /* 特殊化 */\ template<>\ name Parse(const std::string& in)\ {\ name r;\ Conv(in, r);\ return r;\ }\ template<>\ std::string ToString(name in)\ {\ return Conv(in);\ }\ }
使い方
#include "enum.h" enum class Foo { X,Y,Z }; REGIS_ENUM(Foo,(X)(Y)(Z));