键入trait以标识可以二进制形式读取/写入的类型

met*_*fox 6 c++ binaryfiles traits c++11

是否有类型特征(或概念)来识别以下哪些类型是安全的?

template <typename T>
std::enable_if_t<std::some_type_trait<T>::value> Write(std::ostream &os,const T &x)
  { os.write(reinterpret_cast<const char *>(&x),sizeof(T)); }

template <typename T>
std::enable_if_t<std::some_type_trait<T>::value> Read(std::istream &is,T &x)
  { is.read(reinterpret_cast<char *>(&x),sizeof(T)); }
Run Code Online (Sandbox Code Playgroud)

我在考虑包含POD的类,不包括指针(但不包括数组).有点像StandardLayoutTypes但没有指针.我既不想约束对象TrivialType也不是TriviallyCopyable.

对不起,如果我不准确.我对数据表示知之甚少.

Jon*_*Mee 5

给定一个1 的参数s,该read方法:

提取字符并将它们存储到第一个元素所指向的字符数组的连续位置 s

所以你真正的问题是:如果我通过将一串字节写入其地址来初始化一个对象,它是否有效?

这是价值表征的概念.并且Trivially Copyable类型的值表示如下:

复制存储中对象占用的字节足以生成具有相同值的另一个对象

因此,您希望确保您的对象是平凡可复制的,这不是标准概念,但它可以简洁地定义为:

对于对象存在至少一个Trivial初始值设定项的断言的精神归结为Trivially Copyable类型的这些要求,它是非静态成员,以及它的任何基类:

  1. 它被赋予Trivial Initializer,或者表现为相应的默认初始化器
  2. 它没有虚拟方法
  3. 它没有volatile限定类型的成员

至于Trivial析构函数的要求:

  • 析构函数不是用户提供的(意思是,它是隐式声明的,或者在其第一个声明中显式定义为默认值)
  • 析构函数不是虚拟的(也就是说,基类析构函数不是虚拟的)
  • 所有直接基类都有微不足道的析构函数
  • 类类型(或类类型数组)的所有非静态数据成员都具有简单的析构函数

完全定义了Trivially Copyable类型意味着什么,"类型特征或概念"不可能确定是否在所有情况下都满足所有这些要求,例如:定义具有签名的Trivial Initializer的类型匹配默认初始化程序可能是也可能不是Trivially Copyable,取决于初始化该初始化程序主体中的类型的代码; 对于这种类型,确定它是否可以简单复制的唯一方法是对初始化程序进行人工检查.然而,如果你愿意收紧到什么要求检测,is_trivially_copyable将保证您的类型中平凡可复制.

  • @metalfox您通常如何在复制构造函数中初始化该指针?如果它是通过自己定义复制构造函数,那么该类不再是简单的可复制构造.类似地,对于移动构造函数,赋值运算符和移动赋值运算符. (2认同)