我正在使用libevent
编写自己的消息传递API。数据由包含packet body
数据字节数组的数据包结构和包含整个数据包大小信息的packet header
包装(因为在完整流中调用回调的原因)。
class PacketHeader {
size_t packet_size;
};
class Packet {
PacketHeader header;
uint8_t* body;
};
但是,我希望用户能够自定义自己的PacketHeader,而我可以处理基础信息的大小信息。这样做的最佳做法是什么?我应该使用继承还是纯虚拟抽象(接口类)。我在考虑以下内容,但不确定这是否是最佳做法。
template <class Derived>
class PacketHeader{
size_t packet_size;
size_t header_size() const {return sizeof(Derived);}
}
答案 0 :(得分:0)
为什么不让数据包自我描述,而不是所有继承的东西,比如:
struct packet_header {
int16_t size; // size_t is too big
uint8_t header; // header size
uint8_t type; // header type, some sort of id for header/message
};
然后,用户可以使用大小定义自己的标题类型,消息将按如下方式组成:
[ ][ ][ ]<--custom header-->[--body--]
因此custom header
块是可选的,并且在包头中指定了大小。然后允许用户特定代码适当地解码标头。