Значения Enum как массив char в С++

У меня есть перечисление в С++

enum color {
    BLACK,GREEN,RED
};

В java я могу получить строковое значение, используя color.BLACK.name(), даст мне значение String..

У С++ есть одно и то же поведение или как я могу преобразовать перечисление в char *.

Ответ 1

Короткий ответ №. Там есть несколько "идиоматических" макросов, которые вы можете сделать, чтобы имитировать эффект.

Причиной этого является то, что С++ стремится заставить вас "заплатить за то, что вам нужно" (что позволяет писать гораздо более эффективный код, если вы его кардинально создаете).

Проект кода статью об этом, и google будет отображаться во многих других.

Ответ 2

Не так давно я сделал какой-то трюк, чтобы правильно отображать перечисления в 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 не могли быть шаблонами

Ответ 3

Там нет прямой поддержки этого языка. Фактически, это было бы трудно, если не невозможно, сделать для общего case: enum в С++ имеет только ограниченную связь с перечислены типы, и вы можете писать такие вещи, как:

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

причем несколько констант перечисления имеют одинаковое значение.

(Я написал код, который анализирует выражения enum и генерирует отображение кода в строки и из них; с учетом перечисления, такого как выше, оно отображает значение перечислимого числа от 0 до "a", независимо от было ли установлено значение a, b или c. Это все еще невероятно полезно, но я считаю, что это правильное решение: внешний чтобы генерировать сопоставления, если вам нужно или запросить их.)