【发布时间】:2015-03-13 17:29:23
【问题描述】:
关于支持和处理多种不同整数大小的一般问题,以及它们是否应该被视为独立类型(如字符串与 int)或其中一个是另一个的子集。具体来说,我正在考虑 uint8_t 和 uint32_t。
我想构造一个消息对象,我将使用它通过网络发送消息。在最简单的情况下,它将有一个包含有效负载大小的标头和一个有效负载。我有 3 种类型的数据要发送。
- 字符串数据,其中标头是字符串的长度,有效负载是字符串。
- 1字节整数数据,其中header为1,payload为uint8_t。
- 4字节整数数据,其中header为4,payload为uint32_t。
(其实我也用了header的一个位来标记它是int还是string类型,但这在这里并不重要)。
在创建我的消息对象时,显然我将字符串与整数区别对待,它有自己的构造函数来创建原始消息。我试图确定处理不同类型整数的最佳实践是什么。
我可以:
- 分开处理。有两个构造函数,一个接受 uint8_t,一个接受 uint32_t。
- 将 uint8_t 视为 uint32_t 的子集,并让 one 构造函数接受 uint32_t,然后测试其最高有效三个字节是否为零。
最终,我希望支持 1、2、4 和 8 字节整数,并且不喜欢如果我采用选项 1 会得到的构造函数激增的想法,因为我可以拥有一个通用构造函数并且测试我传递的值以确定它应该是什么类型。但是我想做“正确”的事情。所以我的问题是......应该将 uint8_t 和 uint32_t 视为单独的类型,就像 string 和 uint8_t 一样。或者将 uint8_t 视为 uin32_t 的子集是否是一种好习惯?
【问题讨论】:
-
为什么不用第三方网络库?它们通常具有流函数,例如 push_int8 push_int32 等。然后您可以根据需要发送成员。如果您使用 int 在对象中仅存储小值,它甚至不必是相同的类型。
-
我会说第一个选项是好方法。类型的目的是在编译时携带信息;第二种选择会丢弃这些信息。我建议为整数类型编写一个通用模板方法。
-
消息对象是严格意义上的传输机制,还是传输类型?如果你为不同的整数类型创建单独的构造函数,你会得到错误,因为整数是隐式可转换的。
标签: c++ integer uint32 uint uint8t