我需要在文件中存储位,而std::bitset对此非常合适,因为当我再次读回结构时,我需要执行许多操作。该类似乎仅由位数组组成,而没有其他成员数据。

所以代替这个

BYTE minuteOfDay[(60 * 24 / CHAR_BIT) + ((60 * 24 % CHAR_BIT) ? 1 : 0)];


我可以有这个:

std::bitset<60 * 24> minuteOfDay;


如果在将来的Visual Studio版本中该类应更改,并且我需要读取使用旧版本编写的文件,我想我仍然可以只将旧的<bitset>标头复制到我的项目中。

但是,在做出一个真正愚蠢的决定之前:这个想法是否由于我现在无法预见的原因而存在某种缺陷?

最佳答案

这个想法有缺陷吗?


是。

首先,失败模式:如您所猜,std::bitset可能会更改其内部表示。除此之外,它还是不是(保证为)标准布局类型,因此初始写入是不确定的。除此之外,您将如何读回它?大概只是读到一个正确对齐的缓冲区中,然后对它进行类型标记吗?那也是非法的。

其次,建议的解决方案:复制旧的<bitset>标头很可怕。它不会成为实际标准库的一部分,并且仍会非法将其自身注入名称空间std中。其他代码很可能会使用本机std::bitset并导致可怕的错误。

最重要的是,与标准库的本机版本分离时,它可能根本无法工作。

第三,正确的解决方案:


使用std::bitset的公共接口将其序列化(反序列化)为某种定义良好的格式

请注意,无论如何这都是微不足道的:std::bitset::to_string已经存在,您可以根据该字符串重新构造一个实例
或编写一个替换类,该类由您控制并保证可以简单地序列化。仅仅因为您没有免费获得std::bitset并不意味着您必须使用原始的char数组将所有岩石撞击在一起。

关于c++ - 在从磁盘写入和读取的结构中使用std::bitset可以吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36605726/

10-12 04:04