【问题标题】:Treatment of integers of different size处理不同大小的整数
【发布时间】:2015-03-13 17:29:23
【问题描述】:

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

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

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

(其实我也用了header的一个位来标记它是int还是string类型,但这在这里并不重要)。

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

我可以:

  1. 分开处理。有两个构造函数,一个接受 uint8_t,一个接受 uint32_t。
  2. 将 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


【解决方案1】:

正如我在 cmets 中所说,第一个选项更好,因为它使用您拥有的类型信息。无需为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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多