2017-09-09 64 views
0

需要注意以下场景: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; 
    } 
} 

上面的代码不能编译,因为数据包的是不是一个命名空间。有没有一种替代方法可以在上面的示例中获得相同的行为,而不用给出枚举类型的全局范围?

回答

2

Opcode不是一个范围的枚举:

auto opcode = Packet::S2C_JOIN_GAME; // ok 

但是没有办法删除Packet,因为你不是在Packet的类的范围内,这是不是一个命名空间,因为你正确提及。

2

答案是否定的。我没有看到你的代码的问题,我发现最好清楚一点,而不是简短。

1

如果项目名称太长,你可以定义一个适当的类型别名:

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; 
    } 
}