Перечислите значения в виде массива 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
, Это все еще невероятно полезно, но я думаю, что это правильное решение: внешняя программа для генерации отображений, если вам нужно или запросить их.)