我正在开发一个项目,我们有一个像这样的标准枚举:
enum Services {
RequestShower = 611,
RequestBath = 617,
RequestShave = 612,
RequestHaircut = 618
};
Run Code Online (Sandbox Code Playgroud)
但是我的老板说最新的C++标准并不认为enum等同于int,所以建议使用类似这样的类:
class VatelPrivateService {
public:
static const short
RequestShower = 611,
RequestBath = 617,
RequestShave = 612,
RequestHaircut = 618;
static const char* getName(int val);
};
ostream operator<<(ostream& os, VatelPrivateService& service);
Run Code Online (Sandbox Code Playgroud)
好吧,我试着像这样实现:
const char* VatelPrivateService::getName(int id)
{
#define CASE_NM(rq) case rq: return #rq
switch(id)
{
CASE_NM(RequestShower);
CASE_NM(RequestBath);
CASE_NM(RequestShave);
CASE_NM(RequestHaircut);
}
#undef CASE_NM
return "";
}
ostream& operator<<(ostream& os, const VatelPrivateService& service)
{
os << VatelPrivateService::getName(service);
return os;
}
Run Code Online (Sandbox Code Playgroud)
并称之为:
cout << "item: " << VatelPrivateService::RequestShower << endl;
Run Code Online (Sandbox Code Playgroud)
但上面的代码没有编译 - 得到:错误C2664:'VatelPrivateService :: getName':无法将参数1从'const VatelPrivateService'转换为'int'
希望你能看到我的意图.我该如何解决?
安格斯
最新的C++标准并不认为枚举等同于int
规范enum没有改变:枚举器仍然可以隐式转换为其底层整数类型.
C++ 11增加了一个新概念,enum class它是一个"强类型和范围的枚举".这种新类型的枚举不允许将其枚举器隐式转换为基础整数类型(但是,您可以使用明确强制转换static_cast).
如果你想编写自己的作用域枚举,提供语义和类似的行为enum class,但可用的编译器不支持enum class,你应该阅读霍华德Hinnant(欣南特)的回答这个问题,其他的,其中他提供了一个工作示例.
| 归档时间: |
|
| 查看次数: |
1414 次 |
| 最近记录: |