c – 键入trait以标识可以二进制形式读取/写入的类型
是否有类型特征(或概念)来识别以下哪些类型是安全的?
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)); } 我在考虑包含POD的类,不包括指针(但不包括数组).像StandardLayoutTypes但没有指针的东西.我既不想将对象约束为TrivialType也不想将TriviallyCopyable约束. 对不起,如果我不准确.我对数据表示知之甚少. 解决方法
给定s的第一个参数,
read 方法:
所以你真正的问题是:如果我通过将一串字节写入其地址来初始化一个对象,它是否有效? 这是Value Representation的概念.Trivially Copyable类型的值表示如下:
因此,您希望确保您的对象是平凡可复制的,这不是标准概念,但它可以简洁地定义为:
对于对象存在至少一个Trivial初始值设定项的断言的精神归结为Trivially Copyable类型的这些要求,它是非静态成员,以及它的任何基类: >它被赋予Trivial Initializer,或者表现为相应的默认初始化器 至于Trivial析构函数的要求:
完全定义了Trivially Copyable类型意味着什么,“类型特征或概念”不可能确定是否在所有情况下都满足所有这些要求,例如:定义具有签名的Trivial Initializer的类型匹配默认初始化程序可能是也可能不是Trivially Copyable,取决于初始化该初始化程序主体中的类型的代码;对于这种类型,确定它是否可以简单复制的唯一方法是对初始化程序进行人工检查.但是,如果您愿意将要求收紧到可检测的要求, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |