为了账号安全,请及时绑定邮箱和手机立即绑定

C ++:将枚举值打印为文本

/ 猿问

C ++:将枚举值打印为文本

C++
慕仰1329654 2019-09-21 15:17:15

如果我有这样的枚举


enum Errors

{ErrorA=0, ErrorB, ErrorC};

然后我要打印到控制台


Errors anError = ErrorA;

cout<<anError;/// 0 will be printed

但是我想要的是文本“ ErrorA”,我可以不使用if / switch来做到吗?

您对此有什么解决方案?


查看完整描述

3 回答

?
绝地无双

使用地图:


#include <iostream>

#include <map>

#include <string>


enum Errors {ErrorA=0, ErrorB, ErrorC};


std::ostream& operator<<(std::ostream& out, const Errors value){

    static std::map<Errors, std::string> strings;

    if (strings.size() == 0){

#define INSERT_ELEMENT(p) strings[p] = #p

        INSERT_ELEMENT(ErrorA);     

        INSERT_ELEMENT(ErrorB);     

        INSERT_ELEMENT(ErrorC);             

#undef INSERT_ELEMENT

    }   


    return out << strings[value];

}


int main(int argc, char** argv){

    std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC << std::endl;

    return 0;   

}

在线性搜索中使用结构数组:


#include <iostream>

#include <string>


enum Errors {ErrorA=0, ErrorB, ErrorC};


std::ostream& operator<<(std::ostream& out, const Errors value){

#define MAPENTRY(p) {p, #p}

    const struct MapEntry{

        Errors value;

        const char* str;

    } entries[] = {

        MAPENTRY(ErrorA),

        MAPENTRY(ErrorB),

        MAPENTRY(ErrorC),

        {ErrorA, 0}//doesn't matter what is used instead of ErrorA here...

    };

#undef MAPENTRY

    const char* s = 0;

    for (const MapEntry* i = entries; i->str; i++){

        if (i->value == value){

            s = i->str;

            break;

        }

    }


    return out << s;

}


int main(int argc, char** argv){

    std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC << std::endl;

    return 0;   

}

使用开关/盒:


#include <iostream>

#include <string>


enum Errors {ErrorA=0, ErrorB, ErrorC};


std::ostream& operator<<(std::ostream& out, const Errors value){

    const char* s = 0;

#define PROCESS_VAL(p) case(p): s = #p; break;

    switch(value){

        PROCESS_VAL(ErrorA);     

        PROCESS_VAL(ErrorB);     

        PROCESS_VAL(ErrorC);

    }

#undef PROCESS_VAL


    return out << s;

}


int main(int argc, char** argv){

    std::cout << ErrorA << std::endl << ErrorB << std::endl << ErrorC << std::endl;

    return 0;   

}


查看完整回答
反对 回复 2019-09-21
?
临摹微笑

使用具有匹配值的字符串数组或向量:


char *ErrorTypes[] =

{

    "errorA",

    "errorB",

    "errorC"

};


cout << ErrorTypes[anError];

编辑:以上解决方案适用于枚举是连续的,即从0开始且没有分配的值。它将与问题中的枚举完美配合。


要进一步证明枚举不是从0开始的情况,请使用:


cout << ErrorTypes[anError - ErrorA];


查看完整回答
反对 回复 2019-09-21
?
莫回无

这是一个基于Boost.Preprocessor的示例:


#include <iostream>


#include <boost/preprocessor/punctuation/comma.hpp>

#include <boost/preprocessor/control/iif.hpp>

#include <boost/preprocessor/comparison/equal.hpp>

#include <boost/preprocessor/stringize.hpp>

#include <boost/preprocessor/seq/for_each.hpp>

#include <boost/preprocessor/seq/size.hpp>

#include <boost/preprocessor/seq/seq.hpp>



#define DEFINE_ENUM(name, values)                               \

  enum name {                                                   \

    BOOST_PP_SEQ_FOR_EACH(DEFINE_ENUM_VALUE, , values)          \

  };                                                            \

  inline const char* format_##name(name val) {                  \

    switch (val) {                                              \

      BOOST_PP_SEQ_FOR_EACH(DEFINE_ENUM_FORMAT, , values)       \

    default:                                                    \

        return 0;                                               \

    }                                                           \

  }


#define DEFINE_ENUM_VALUE(r, data, elem)                        \

  BOOST_PP_SEQ_HEAD(elem)                                       \

  BOOST_PP_IIF(BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(elem), 2),      \

               = BOOST_PP_SEQ_TAIL(elem), )                     \

  BOOST_PP_COMMA()


#define DEFINE_ENUM_FORMAT(r, data, elem)             \

  case BOOST_PP_SEQ_HEAD(elem):                       \

  return BOOST_PP_STRINGIZE(BOOST_PP_SEQ_HEAD(elem));



DEFINE_ENUM(Errors,

            ((ErrorA)(0))

            ((ErrorB))

            ((ErrorC)))


int main() {

  std::cout << format_Errors(ErrorB) << std::endl;

}


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信