我在 C++ 中有一个枚举
enum color {
BLACK,GREEN,RED
};
在java中,我可以接收字符串值,使用color.BLACK.name()
会给我字符串值..
c++ 是否具有相同的行为,或者我如何将枚举转换为 char*。
简短的回答没有。不过,您可以使用许多“惯用的”宏技巧来模仿效果。
这样做的原因是 C++ 倾向于让你“只为你需要的东西买单”(如果你仔细设计,这使得编写性能更高的代码成为可能)。
代码项目有一篇关于这方面的文章,谷歌会找到很多其他的。
不久前,我做了一些技巧,让枚举在 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
,您还可以进行反向转换。引入了converter的通用基类将其存储在Qt对象中,因为Qt对象不能是模板
语言中没有对此的直接支持。事实上,对于一般情况,即使不是不可能,也很难做到:enum
在 C++ 中,与枚举类型只有有限的关系,您可以编写如下内容:
enum E
{
a = 0,
b = 0,
c = 0
};
, 有几个枚举常量具有相同的值。
(我编写了解析枚举语句的代码,并生成与字符串之间的映射代码;给定一个像上面这样的枚举,它会将枚举值 0 映射到,"a"
无论它是设置为还是。它仍然非常有用,但我认为这是正确的解决方案:如果您需要或请求它们,可以使用外部程序生成映射。)a
b
c