2017-09-09 94 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; 
    } 
}