C++使用特定的类和枚举范围switch语句中
问题描述:
需要注意以下场景:C++使用特定的类和枚举范围switch语句中
class Packet {
public:
enum Opcode {
S2C_JOIN_GAME,
S2C_LEAVE_GAME
} opcode;
std::string payload;
};
class Client{
public:
void readPacket(Packet packet);
};
void Client::readPacket(Packet packet){
switch(packet.opcode){
case Packet::Opcode::S2C_JOIN_GAME:
//call some function to handle this case
break;
case Packet::Opcode::S2C_LEAVE_GAME:
//call another function to handle this case
break;
}
}
在Client::readPacket
,我需要检查操作码和调用依赖于它特定的功能。在我的项目中,我有很多不同的操作码。我可以在switch语句中使用特定范围,因此我不需要每次输入Packet::Opcode
?
例如:
void Client::readPacket(Packet packet){
switch(packet.opcode){
using namespace Packet::Opcode; //illegal, is there something similar?
using namespace Packet; // also illegal
case S2C_JOIN_GAME:
//do stuff.
break;
case S2C_LEAVE_GAME:
//do stuff.
break;
}
}
上面的代码不能编译,因为数据包的是不是一个命名空间。有没有一种替代方法可以在上面的示例中获得相同的行为,而不用给出枚举类型的全局范围?
答
Opcode
不是一个范围的枚举:
auto opcode = Packet::S2C_JOIN_GAME; // ok
但是没有办法删除Packet
,因为你不是在Packet
的类的范围内,这是不是一个命名空间,因为你正确提及。
答
答案是否定的。我没有看到你的代码的问题,我发现最好清楚一点,而不是简短。
答
如果项目名称太长,你可以定义一个适当的类型别名:
void Client::readPacket(Packet packet)
{
using Opcode = Packet::Opcode;
switch(packet.opcode)
{
case Opcode::S2C_JOIN_GAME:
//do stuff.
break;
case Opcode::S2C_LEAVE_GAME:
//do stuff.
break;
}
}