我在c ++中有一个枚举
enum color {
BLACK,GREEN,RED
};
在java中我可以使用color.BLACK.name()
接收字符串值,它会给我字符串值..
c ++是否具有相同的行为,或者如何将枚举转换为char *。
答案 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"
是否设置为a
,b
或c
。它仍然令人难以置信
有用,但我认为这是正确的解决方案:外部
程序生成映射如果你需要或请求它们。)