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

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

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

C++
Helenr 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 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

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


char *ErrorTypes[] =

{

    "errorA",

    "errorB",

    "errorC"

};


cout << ErrorTypes[anError];

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


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


cout << ErrorTypes[anError - ErrorA];


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

TA贡献1865条经验 获得超7个赞

这是一个基于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
  • 3 回答
  • 0 关注
  • 735 浏览

添加回答

举报

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