首页 > 解决方案 > 检查一个类型的所有字段是否都是“原始”

问题描述

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

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 的任何其他条件?

标签: c++

解决方案


我想琐碎的可复制性并不能真正说明安全性。

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

例如:

假设 Data 包含一个非平凡可复制类型的指针。指针本身实际上是trivially-copyable,它使整个类型trivially-copyable。但是是否有任何意义将指针值写入文件?

因此,即使您决定检查每个成员值是否是trivially-copyable并得到肯定的答案,也不一定意味着您可以将此类型写入文件。

另一个例子:

另一方面,如果一个类型仅包含原始类型并且具有复制或移动构造函数,则它被称为非平凡可复制的,但写入文件是完全安全的。


推荐阅读