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

标签 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 不是命名空间。有没有另一种方法可以在不给我的枚举类型全局范围的情况下获得上面示例中的相同行为?

最佳答案

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

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

关于C++ 在 switch 语句中使用特定的类和枚举范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46135258/

相关文章:

c++ - 字符串值与 C++ 不匹配

c# - 如何在 .NET Standard 中为通用枚举类型设置枚举标志?

java - 单元测试中的请求范围 bean 管理

c++ - 对象超出范围/转移所有权

c++ - 我们如何区分使用重载的 [] 运算符来获取和设置?

c++ - 为什么在 HowardHinnant 的 date.h 库中没有用于 to_stream 和 from_stream 格式的毫秒标志

c++ - OpenGL使旋转函数给出 vector

c# - 什么是更好的 : an Enum or a singleton

c++ - alListener3f(AL_ORIENTATION, 0, 0, -1) 之后的 OpenAL AL_ILLEGAL_ENUM

javascript - JavaScript 闭包的一个包罗万象的定义