gpt4 book ai didi

c++ - 从非模板基类扩展并覆盖函数参数的模板类

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:24 24 4
gpt4 key购买 nike

我正在尝试为 PacketDecoder 创建一个非模板基类,以便我可以将 Base* 存储在 std::map 中。解码功能被正确覆盖。编码函数给我这个错误“'编码'不是虚拟的,不能声明为纯”。我可能会从 Java 背景中错误地考虑这个问题。是否有更惯用的 C++ 方法来解决这个问题?

class Base {
public:
virtual Packet* decode(folly::io::Cursor& cursor) = 0;
virtual void encode(Packet* packet) = 0;
};

template<typename T, typename std::enable_if<std::is_base_of<Packet, T>::value>::type* = nullptr>
class PacketDecoder : public Base {
public:
virtual T* decode(folly::io::Cursor& cursor) = 0;
virtual void encode(T *packet) = 0;
};

示例用法:

class TestDecoder : public PacketDecoder<ProxyJoinPacket> {
public:
ProxyJoinPacket *decode(folly::io::Cursor &cursor) override {
uint32_t stringLength;
if (!cursor.tryReadBE<uint32_t>(stringLength)) {
throw std::runtime_error("Failed to read string length");
}

if (cursor.length() < stringLength) {
throw std::runtime_error("Too few bytes for string");
}

auto uuid = cursor.readFixedString(stringLength);
return new ProxyJoinPacket(uuid);
}

void encode(ProxyJoinPacket *packet) override {

}


};

std::vector<Base*> decoders;
void a() {
decoders.insert(new TestDecoder()); // error "Allocating an object of abstract class type 'TestDecoder'"
}

最佳答案

问题是你原来的类有这个虚函数:

virtual void encode(Packet* packet) = 0;

然后你的继承类有这个:

virtual void encode(T *packet) = 0;

这是两个不同的虚函数。

所以当你这样做的时候:

void encode(ProxyJoinPacket *packet) override {

您只能覆盖继承类中的方法,而不是 Base 中的方法,它仍然缺失。

因此更改您的继承类以使用Packet

virtual void encode(Packet* packet) = 0;

您还可以更改继承的类并添加如下内容:

void encode(Packet* packet) final {
encode(dynamic_cast<T*> packet);
}

也不要忘记虚拟析构函数...

关于c++ - 从非模板基类扩展并覆盖函数参数的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53210402/

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