如果您不想将数据读取绑定到一个完整的构造函数中(出于关注分离的原因,这是可以理解的原因),那么这是非多态继承的一个很好的应用程序:
struct Header {
static constexpr SIZE=10;
Header(std::array);
std::int8_t get_command() const {return command;}
std::int16_t get_options() const {return options;}
std::int32_t body_size() const {return length;}
private:
std::int8_t command;
std::int16_t options;
std::int32_t length;
};
struct Packet : private Header {
using Body=std::vector;
Packet(const Header &h,Body b) : Header(h),body(std::move(b))
{if(body.size()!=body_size()) throw …;}
using Header::get_command;
using Header::get_options;
const Body& get_body() const {return body;}
private:
Body body;
};
// For some suitable Stream class:
Header read1(Stream &s)
{return {s.read<:size>()};}
Packet read2(const Header &h,Stream &s)
{return {h,s.read(h.body_size())};}
Packet read(Stream &s)
{return read2(read1(s),s);}
请注意,私有继承可防止不确定的行为通过Header *以及确实非预期的行为删除数据包
const Packet p=read(s);
const Packet q=read2(p,s); // same header?!
合成当然也可以工作,但是在完整的实现中可能会导致更多的适配器代码.
如果您确实在进行优化,则可以在没有主体大小的情况下制作HeaderOnly,然后从中获取Header和Packet.