gpt4 book ai didi

c++ - 解析一个 id 并实例化一个关联的类

转载 作者:行者123 更新时间:2023-11-28 04:42:29 25 4
gpt4 key购买 nike

我正在用 C++ 为 TCP 套接字通信构建协议(protocol)。当我捕获传入数据包的 ID 时,我想制作一个通用代码来查找我收到的哪个已知数据包(在我的协议(protocol)中)。

class NetworkMessage {
public:
virtual ~NetworkMessage();

virtual void serialize(NetworkBuffer &buffer) = 0;
virtual void deserialize(NetworkBuffer &buffer) = 0;

virtual int32_t getProtocolId() const = 0;
};

消息示例

class HelloConnectMessage: public NetworkMessage {

public:
static constexpr int32_t PROTOCOL_ID = 1;

void serialize(NetworkBuffer &buffer) override;
void deserialize(NetworkBuffer &buffer) override;
int32_t getProtocolId() const override;

int32_t getHelloVar() const;
private:
int32_t _hellovar;
};

我想将 protocolId 映射到 NetworkMessage 的关联子类,但我们不能像 Java 那样保存类类型。我正要编写类似以下代码的代码,但无法编译,因为它只是我真正想要的想法。

std::unordered_map<int, class<? extends NetworkMessage>> messages;

我现在的替代方案如下:

static NetworkMessage build_packet(NetworkBuffer &buffer) {
int32_t id = buffer.readInt();
switch(id) {
case HelloConnectMessage::PROTOCOL_ID:
HelloConnectMessage msg;
msg.deserialize(buffer);
return msg;
default:
throw std::runtime_error("invalid packet");
}
}

但这还不够通用。我会浪费时间为每条消息重写相同的代码。非常感谢任何帮助,我对 c++ 不熟悉

最佳答案

使用工厂函数填充您的 map 。像这样:

template <typename Msg>
std::unique_ptr<NetworkMessage> MakeMessage() { return std::make_unique<Msg>(); }

using Factory_t = std::unique_ptr<NetworkMessage>(*)();

std::unordered_map<int, Factory_t> messages = {
{HelloConnectMessage::PROTOCOL_ID, MakeMessage<HelloConnectMessage>},
...
};

std::unique_ptr<NetworkMessage> build_packet(NetworkBuffer &buffer) {
...
auto msg = messages[id]();
msg->deserialize(buffer);
return msg;
}

关于c++ - 解析一个 id 并实例化一个关联的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49932415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com