问题简而言之:我考虑重写一些UDP协议的数据包处理代码......从C到C ++。显然,我可以使用C中的结构来建模数据,但那么重点是什么?所以,为了争论,我们有:
struct { uint8:2 type; uint8:6 con_id; uint16 seq_num } packet_header;
struct { packet_header ph; uint16 command; } control_packet;
struct { packet_header ph; uchar8 data[DATASIZE]; } data_packet;
在这种情况下,"键入"数据为0,控制为1,加密数据为2,加密控制为3。还有一些结构代表每个控制包,为了争论,让我们说"打开"和"关闭"。
现在......我通常会有一个类型,提取包的函数返回和发送的函数接受:
struct {
size_t pkt_len;
union {
uchar8 raw_packet[DATASIZE];
packet_header ph;
control_packet cp;
control_open_packet cop;
control_close_packet ccp;
data_packet dp;
} p;
} packet;
...这都是为参数简化的...但重点是:在发送数据包时,我们想要创建某种类型的数据包并发送通用数据包。相反,在接收数据包时,您希望接收通用数据包,并在分类时将其转换为更具体的类型。
那么问题出在哪里?我的问题是:如果Variant和Any不适合表达这个,那是什么?在这种情况下,我是否坚持工会?当然,我并没有违反工会的POD类型(目前为止)的规定。我一直在搜索C ++ 11和Boost(并且在某种程度上正在研究C ++ 14 ......虽然我仍然坚持使用C ++ 11)并且我没有看到提供的解决方案。
答案 0 :(得分:1)
您可以在示例或类层次结构中使用union,而export default Ember.Route.extend({
actions: {
deleteUser: function(user) {
var record = this.modelFor('user');
record.destroyRecord().then(() => {
this.transitionTo('users');
});
},
}
});
是每种类型数据包的顶级和特定派生类:
packet_header
也许您需要在处理数据包的代码中寻求优雅和灵活性。我怀疑以其他方式定义数据(使用boost或使用C ++ 17功能)将带来可观的收益。
请注意struct packet_header { uint8:2 type; uint8:6 con_id; uint16 seq_num };
struct control_packet : packet_header { uint16 command; };
struct data_packet: packet_header { uchar8 data[DATASIZE]; };
struct packet
{
size_t pkt_len;
union
{
uchar8 raw_packet[DATASIZE];
packet_header ph;
control_packet cp;
control_open_packet cop;
control_close_packet ccp;
data_packet dp;
};
};
中的匿名联盟。它允许直接访问特定数据包类型的字段。 C ++样式需要在struct packet
关键字后面直接使用结构名称。