3

我在 C++ 中有一个枚举

enum color {
    BLACK,GREEN,RED
};

在java中,我可以接收字符串值,使用color.BLACK.name()会给我字符串值..

c++ 是否具有相同的行为,或者我如何将枚举转换为 char*。

4

3 回答 3

4

简短的回答没有。不过,您可以使用许多“惯用的”宏技巧来模仿效果。

这样做的原因是 C++ 倾向于让你“只为你需要的东西买单”(如果你仔细设计,这使得编写性能更高的代码成为可能)。

代码项目有一篇关于这方面的文章,谷歌会找到很多其他的。

于 2013-03-07T07:31:40.473 回答
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()能够将枚举转换为字符串。如果您替换kv_storage_tboost::bimap,您还可以进行反向转换。引入了converter的通用基类将其存储在Qt对象中,因为Qt对象不能是模板

于 2013-03-07T08:21:09.277 回答
0

语言中没有对此的直接支持。事实上,对于一般情况,即使不是不可能,也很难做到:enum在 C++ 中,与枚举类型只有有限的关系,您可以编写如下内容:

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

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

(我编写了解析枚举语句的代码,并生成与字符串之间的映射代码;给定一个像上面这样的枚举,它会将枚举值 0 映射到,"a"无论它是设置为还是。它仍然非常有用,但我认为这是正确的解决方案:如果您需要或请求它们,可以使用外部程序生成映射。)abc

于 2013-03-07T09:22:19.610 回答