枚举值为c ++中的char数组

时间:2013-03-07 07:26:53

标签: c++ enums

我在c ++中有一个枚举

enum color {
    BLACK,GREEN,RED
};

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

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

3 个答案:

答案 0 :(得分:4)

简短的回答没有。不过,你可以采用一些“惯用”的宏观技巧来模仿这种效果。

这样做的原因是C ++倾向于让你“为你只需要的东西付费”(这使你可以编写更多高性能的代码)。

代码项目上有an article,谷歌会出现很多其他内容。

答案 1 :(得分: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_t替换为boost::bimap,您还可以进行向后转换。 引入转换器的公共基类将其存储在Qt对象中,因为Qt对象不能是模板

答案 2 :(得分:0)

这种语言没有直接的支持。事实上,它 如果不是不可能的话,为将军做很难的事 case:C ++中的enum与...的关系有限 枚举类型,您可以编写如下内容:

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

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

(我编写了解析枚举语句并生成的代码 映射代码到字符串和从字符串给出一个像这样的枚举 在上面,无论如何,它都会将枚举值0映射到"a" 是否设置为abc。它仍然令人难以置信 有用,但我认为这是正确的解决方案:外部 程序生成映射如果你需要或请求它们。)