我有一个在 C++ 中的枚举类型。
在Java中,我可以使用
enum color {
BLACK,GREEN,RED
};
在Java中,我可以使用
color.BLACK.name()
来获取字符串值。那么C++是否具有相同的行为呢?或者说,如何将枚举转换为char*。enum color {
BLACK,GREEN,RED
};
color.BLACK.name()
来获取字符串值。那么C++是否具有相同的行为呢?或者说,如何将枚举转换为char*。简短回答是不行的。但有很多“惯用”的宏技巧可以模仿这种效果。
原因是C++倾向于让你“为所需付费”(如果你设计得当,这将使编写更高性能的代码成为可能)。
Code project 有一篇文章介绍了这个问题,而谷歌会找到许多其他相关文章。
不久前,我做了一些小技巧,使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()
,可以将枚举转换为字符串。如果您使用boost::bimap
替换kv_storage_t
,则还可以进行反向转换。
引入了通用的转换器基类,以将其存储在Qt对象中,因为Qt对象不能是模板。这种语言并没有直接支持它。实际上,对于一般情况而言,这可能很困难,甚至不可能实现:C++
中的enum
与枚举类型之间只有有限的关系,你可以编写如下代码:
enum E
{
a = 0,
b = 0,
c = 0
};
有几个枚举常量具有相同的值。
(我编写了解析枚举语句并生成字符串映射代码的代码;对于上述枚举,它将将值为0的枚举值映射为"a"
,无论它是设置为a
、b
还是c
。它仍然非常有用,但我认为这是正确的解决方案:一个外部程序来生成映射,如果您需要或请求它们。)