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.
对不起,如果我不准确.我对数据表示知之甚少.
给定一个1 日的参数s,该read方法:
提取字符并将它们存储到第一个元素所指向的字符数组的连续位置
s
所以你真正的问题是:如果我通过将一串字节写入其地址来初始化一个对象,它是否有效?
这是价值表征的概念.并且Trivially Copyable类型的值表示如下:
复制存储中对象占用的字节足以生成具有相同值的另一个对象
因此,您希望确保您的对象是平凡可复制的,这不是标准概念,但它可以简洁地定义为:
- 每个复制构造函数都是微不足道的或已删除
- 每个移动构造函数都是微不足道的或删除的
- 每个复制赋值运算符都是微不足道的或已删除
- 每个移动赋值运算符都是微不足道的或已删除
- 至少一个复制构造函数,移动构造函数,复制赋值运算符或移动赋值运算符未被删除
- 琐碎的非删除析构函数
对于对象存在至少一个Trivial初始值设定项的断言的精神归结为Trivially Copyable类型的这些要求,它是非静态成员,以及它的任何基类:
至于Trivial析构函数的要求:
- 析构函数不是用户提供的(意思是,它是隐式声明的,或者在其第一个声明中显式定义为默认值)
- 析构函数不是虚拟的(也就是说,基类析构函数不是虚拟的)
- 所有直接基类都有微不足道的析构函数
- 类类型(或类类型数组)的所有非静态数据成员都具有简单的析构函数
完全定义了Trivially Copyable类型意味着什么,"类型特征或概念"不可能确定是否在所有情况下都满足所有这些要求,例如:定义具有签名的Trivial Initializer的类型匹配默认初始化程序可能是也可能不是Trivially Copyable,取决于初始化该初始化程序主体中的类型的代码; 对于这种类型,确定它是否可以简单复制的唯一方法是对初始化程序进行人工检查.然而,如果你愿意收紧到什么要求是检测,is_trivially_copyable将保证您的类型中平凡可复制.
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |