Перечислите значения в виде массива char в C++

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

enum color {
    BLACK,GREEN,RED
};

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

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

3 ответа

Решение

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

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

У проекта Code есть статья на эту тему, и Google найдет много других.

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

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

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

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

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

Другие вопросы по тегам