0

关于支持和处理多个不同整数大小的一般问题,以及它们是否应该被视为独立类型(如字符串与 int)或另一个的子集。具体来说,我正在考虑 uint8_t 和 uint32_t。

我想构造一个消息对象,我将使用它通过网络发送消息。在最简单的情况下,它将有一个包含有效负载大小的标头和一个有效负载。我有 3 种类型的数据要发送。

  1. 字符串数据,其中标头是字符串的长度,有效负载是字符串。
  2. 1 字节整数数据,其中标头为 1,有效负载为 uint8_t。
  3. 4 字节整数数据,其中标头为 4,有效负载为 uint32_t。

(实际上我也使用了一个标头来标记它是 int 还是 string 类型,但这在这里并不重要)。

在创建我的消息对象时,显然我将字符串与整数区别对待,它有自己的构造函数来创建原始消息。我试图确定处理不同类型整数的最佳实践是什么。

我可以:

  1. 分别对待它们。有两个构造函数,一个接受 uint8_t,一个接受 uint32_t。
  2. 将 uint8_t 视为 uint32_t 的子集,并具有一个接受 uint32_t 的构造函数,然后测试其最高有效三个字节是否为零。

最终,我希望支持 1、2、4 和 8 字节整数,并且不喜欢如果我采用选项 1 会得到的构造函数激增的想法,当我可以拥有一个通用构造函数并测试值时我通过什么来确定它应该是什么类型。但是我想做“正确”的事情。所以我的问题是......应该将 uint8_t 和 uint32_t 视为单独的类型,就像 string 和 uint8_t 一样。还是将 uint8_t 视为 uin32_t 的子集是一种好习惯?

4

1 回答 1

0

正如我在评论中所说,第一个选项更好,因为它使用您拥有的类型信息。无需为 等创建不同的消息构造uint8函数uint32;模板会帮助你。

这是一个通用消息构造函数的示例,它适用于所有 POD 类型:

template <typename T, typename = std::enable_if<std::is_pos<T>::value, void>::type>
message create_message (T const & x)
{
    message m;
    m.write(&x, sizeof(T));
    return m;
}

(我假设你的message类型有一些方法,比如write(void*, size_t)

于 2015-03-13T17:50:59.193 回答