C ++在switch语句中使用特定的类和枚举范围

时间:2017-09-09 21:26:32

标签: c++ enums scope

请注意以下情况:

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

上面的代码无法编译,因为Packet不是命名空间。是否有另一种方法可以在上面的示例中获得相同的行为而不给出我的枚举类型全局范围?

4 个答案:

答案 0 :(得分:2)

Opcode不是作用域枚举:

auto opcode = Packet::S2C_JOIN_GAME; // ok

但是没有办法删除Packet,因为你不在Packet的类范围内,并且它不是命名空间,正如你所正确提到的那样。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

使用C ++ 20,现在可以在切换范围中使用“ using”关键字。


#include <cstdint>

enum class my_enumeration : std::uint8_t{
    type1,
    type2,
    type3
};

/* ... */

void foo(my_enumeration e) {
  switch(e){
     using enum my_enumeration;
     case type1:
     case type2: 
     case type3:
        break;
  }
}