Is there a simple way to convert C++ enum to string?

后端 未结 30 2763
我在风中等你
我在风中等你 2020-11-22 10:37

Suppose we have some named enums:

enum MyEnum {
      FOO,
      BAR = 0x50
};

What I googled for is a script (any language) that scans all

30条回答
  •  礼貌的吻别
    2020-11-22 11:13

    This was my solution with BOOST:

    #include 
    
    #define X_STR_ENUM_TOSTRING_CASE(r, data, elem)                                 \
        case elem : return BOOST_PP_STRINGIZE(elem);
    
    #define X_ENUM_STR_TOENUM_IF(r, data, elem)                                     \
        else if(data == BOOST_PP_STRINGIZE(elem)) return elem;
    
    #define STR_ENUM(name, enumerators)                                             \
        enum name {                                                                 \
            BOOST_PP_SEQ_ENUM(enumerators)                                          \
        };                                                                          \
                                                                                    \
        inline const QString enumToStr(name v)                                      \
        {                                                                           \
            switch (v)                                                              \
            {                                                                       \
                BOOST_PP_SEQ_FOR_EACH(                                              \
                    X_STR_ENUM_TOSTRING_CASE,                                       \
                    name,                                                           \
                    enumerators                                                     \
                )                                                                   \
                                                                                    \
                default:                                                            \
                    return "[Unknown " BOOST_PP_STRINGIZE(name) "]";                \
            }                                                                       \
        }                                                                           \
                                                                                    \
        template                                                        \
        inline const T strToEnum(QString v);                                        \
                                                                                    \
        template <>                                                                 \
        inline const name strToEnum(QString v)                                      \
        {                                                                           \
            if(v=="")                                                               \
                throw std::runtime_error("Empty enum value");                       \
                                                                                    \
            BOOST_PP_SEQ_FOR_EACH(                                                  \
                X_ENUM_STR_TOENUM_IF,                                               \
                v,                                                                  \
                enumerators                                                         \
            )                                                                       \
                                                                                    \
            else                                                                    \
                throw std::runtime_error(                                           \
                            QString("[Unknown value %1 for enum %2]")               \
                                .arg(v)                                             \
                                .arg(BOOST_PP_STRINGIZE(name))                      \
                                    .toStdString().c_str());                        \
        }
    

    To create enum, declare:

    STR_ENUM
    (
        SERVICE_RELOAD,
            (reload_log)
            (reload_settings)
            (reload_qxml_server)
    )
    

    For conversions:

    SERVICE_RELOAD serviceReloadEnum = strToEnum("reload_log");
    QString serviceReloadStr = enumToStr(reload_log);
    

提交回复
热议问题