在C++中将枚举值作为字符数组

3
我有一个在 C++ 中的枚举类型。
enum color {
    BLACK,GREEN,RED
};

在Java中,我可以使用 color.BLACK.name() 来获取字符串值。那么C++是否具有相同的行为呢?或者说,如何将枚举转换为char*。

1
简短回答:不行。然而,有许多“惯用”的宏技巧可以模拟该效果。 - sehe
@sehe,你能解释一下吗? - Kathick
在C++中,你不会问“如何将X转换为char*”,而是会问“如何为X编写输出流运算符”。有了这个运算符,你可以将流输出到字符串、标准输出、标准错误、文件等。 - juanchopanza
3个回答

4

简短回答是不行的。但有很多“惯用”的宏技巧可以模仿这种效果。

原因是C++倾向于让你“为所需付费”(如果你设计得当,这将使编写更高性能的代码成为可能)。

Code project 有一篇文章介绍了这个问题,而谷歌会找到许多其他相关文章。


1

不久前,我做了一些小技巧,使QComboBox中的枚举得到正确显示,并将枚举和字符串表示的定义作为一个语句来处理。

#pragma once
#include <boost/unordered_map.hpp>

namespace enumeration
{

   struct enumerator_base : boost::noncopyable
   {
      typedef
         boost::unordered_map<int, std::wstring>
         kv_storage_t;
      typedef
         kv_storage_t::value_type
         kv_type;
      kv_storage_t const & kv() const
      {
         return storage_;
      }

      LPCWSTR name(int i) const
      {
         kv_storage_t::const_iterator it = storage_.find(i);
         if(it != storage_.end())
            return it->second.c_str();
         return L"empty";
      }

   protected:
      kv_storage_t storage_;
   };

   template<class T>
   struct enumerator;

   template<class D>
   struct enum_singleton : enumerator_base
   {
      static enumerator_base const & instance()
      {
         static D inst;
         return inst;
      }
   };
}

#define QENUM_ENTRY(K, V, N)  K, N storage_.insert(std::make_pair((int)K, V));

#define QBEGIN_ENUM(NAME, C)   \
enum NAME                     \
{                             \
   C                          \
}                             \
};                            \
}                             \

#define QEND_ENUM(NAME) \
};                     \
namespace enumeration  \
{                      \
template<>             \
struct enumerator<NAME>\
   : enum_singleton< enumerator<NAME> >\
{                      \
   enumerator()        \
   {

//usage
/*
QBEGIN_ENUM(test_t,
   QENUM_ENTRY(test_entry_1, L"number uno",
   QENUM_ENTRY(test_entry_2, L"number dos",
   QENUM_ENTRY(test_entry_3, L"number tres",
QEND_ENUM(test_t)))))
*/

现在您已经拥有enumeration::enum_singleton<your_enum>::instance(),可以将枚举转换为字符串。如果您使用boost::bimap替换kv_storage_t,则还可以进行反向转换。 引入了通用的转换器基类,以将其存储在Qt对象中,因为Qt对象不能是模板。

0

这种语言并没有直接支持它。实际上,对于一般情况而言,这可能很困难,甚至不可能实现:C++中的enum与枚举类型之间只有有限的关系,你可以编写如下代码:

enum E
{
    a = 0,
    b = 0,
    c = 0
};

有几个枚举常量具有相同的值。

(我编写了解析枚举语句并生成字符串映射代码的代码;对于上述枚举,它将将值为0的枚举值映射为"a",无论它是设置为ab还是c。它仍然非常有用,但我认为这是正确的解决方案:一个外部程序来生成映射,如果您需要或请求它们。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接