据我所知,您想要的确切形式是不可能的。正如尼尔所说,名字对我们来说只是人类;编译器处理这些值。
也就是说,您可以创建一个实用程序来为枚举命名。这是一个例子:
#define ENUM_NAMES_BEGIN(pType) \
std::ostream& operator<<(std::ostream& pStream, pType pValue) \
{ \
switch (pValue) \
{
#define ENUM_NAMES_CASE_NAMED(pValue, pName) \
case (pValue): \
pStream << (pName); \
break;
#define ENUM_NAMES_CASE(pValue) ENUM_NAMES_CASE_NAMED(pValue, #pValue)
#define ENUM_NAMES_END(pDefault) \
default: \
pStream << (pDefault); \
} \
\
return pStream; \
}
你会这样使用它:
#include <iostream>
enum Days
{
Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
};
enum NotNamed
{
DontTry, ImNotnamed
};
ENUM_NAMES_BEGIN(Days)
ENUM_NAMES_CASE(Sunday)
ENUM_NAMES_CASE(Monday)
ENUM_NAMES_CASE(Tuesday)
ENUM_NAMES_CASE(Wednesday)
ENUM_NAMES_CASE(Thursday)
ENUM_NAMES_CASE(Friday)
ENUM_NAMES_CASE_NAMED(Saturday, "Saturday: Fun day!")
ENUM_NAMES_END("")
int main()
{
Days d = Saturday; // or whatever
NotNamed n = ImNotnamed;
std::cout << "Day: " << d << std::endl;
std::cout << "Not Named: " << n << std::endl;
}
尝试使用“未命名”类型返回其数值。
注意,这里实际上并没有强制执行枚举;例如,您可以使用它来命名整数值。如果你这样做了,operator<< 将是模棱两可的。
如果您可以使用 Boost,请使用它们的类型特征 is_enum(相当复杂)并静态断言它就是这种情况。为此,更改将是:
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_enum.hpp>
#define ENUM_NAMES_BEGIN(pType) \
std::ostream& operator<<(std::ostream& pStream, pType pValue) \
{ \
BOOST_STATIC_ASSERT(boost::is_enum<pType>::value); \
switch (pValue) \
{
现在,如果类型不是枚举,则编译错误至少指向您尝试定义枚举名称的行。