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