読者です 読者をやめる 読者になる 読者になる

【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));

サンプル