检查类型的所有字段是否均为“原始”

时间:2018-08-07 07:50:29

标签: c++

出于某种原因,我想做类似的事情:

template<typename Data>
void write(const Data& data) {
    std::fstream out {...};
    out.write(reinterpret_cast<const char *>(&data), sizeof(Data));
    out.flush();
}

Data是仅具有原始类型的类型,或更具体而言,是可以简单复制的类型。这是否意味着如果我在static_assert (std::is_trivially_copyable<Data>::value, "");中使用write(),我真的确定没有类型可以传递给不能重新解释为字节的函数吗?还是我应该在static_assert中检查其他条件?

1 个答案:

答案 0 :(得分:2)

我猜可复制的程度并不能真正说明安全性。

但是无论如何,你应该自己决定。

例如:

假设数据包含不可平凡类型的指针。指针本身实际上是可轻松复制的,它使整个类型可轻松复制的。但是,有没有将指针值写入文件的感觉?

因此,即使您决定检查每个成员值是否都是容易复制的并获得肯定的答案,也不一定意味着您可以将此类型写入文件。

另一个例子:

另一方面,如果一个类型仅包含基本类型并且具有副本或移动构造函数,则将其归为不可平凡复制,但是将其写入是完全安全的一个文件。