治疗不同大小的整数

时间:2015-03-13 17:29:23

标签: c++ integer uint32 uint uint8t

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

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

  1. 字符串数据,其中标头是字符串的长度,有效负载是字符串。
  2. 1字节整数数据,其中标头为1,有效负载为uint8_t。
  3. 4字节整数数据,其中标头为4,有效负载为uint32_t。
  4. (实际上我也使用标题的一位来标记它是int还是字符串类型,但这在这里并不重要。)

    在创建我的消息对象时,显然我将字符串视为与整数不同,并且它有自己的构造函数来创建原始消息。我正在尝试确定处理不同类型整数的最佳实践。

    我可以:

    1. 单独对待它们。有两个构造函数,一个接受uint8_t,另一个接受uint32_t。
    2. 将uint8_t视为uint32_t的子集,并让一个构造函数接受uint32_t,然后测试其最重要的三个字节是否为零。
    3. 最终我想支持1,2,4和8字节的整数,并且不喜欢构造函数中的扩散的想法,如果我选择1,当我可以有一个通用构造函数时,我会得到测试我传递的值以确定它应该是什么类型。但是我想做“正确”的事情。所以我的问题是......应该将uint8_t和uint32_t视为单独的类型,就像字符串和uint8_t一样。或者将uint8_t视为uin32_t的子集是一种好习惯吗?

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说,第一个选项更好,因为它使用了您拥有的类型信息。无需为uint8uint32和其他人创建不同的消息构造函数;模板可以帮到你。

这是一个通用消息构造函数的示例,适用于所有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)

相关问题