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 的任何其他条件?
解决方案
我想琐碎的可复制性并不能真正说明安全性。
但无论如何,你应该自己决定。
例如:
假设 Data 包含一个非平凡可复制类型的指针。指针本身实际上是trivially-copyable,它使整个类型trivially-copyable。但是是否有任何意义将指针值写入文件?
因此,即使您决定检查每个成员值是否是trivially-copyable并得到肯定的答案,也不一定意味着您可以将此类型写入文件。
另一个例子:
另一方面,如果一个类型仅包含原始类型并且具有复制或移动构造函数,则它被称为非平凡可复制的,但写入文件是完全安全的。
推荐阅读
- python - Pandas 从 Excel 读取时会更改数字
- java - 由于基础异常而无法加载连接类:com.mysql.cj.exceptions.WrongArgumentException
- reactjs - 福米克
如果使用 componentDidMount/setState,initialValue 未定义 - taskscheduler - 在管理员帐户下创建时间触发器 Windows 任务时访问被拒绝
- python - Ruby 等价于 Python chain()
- scala - typeclass 注释应该已被 simulacrum 删除,但没有
- swift - UINavigationbar 在返回时掩盖项目
- python - 解析具有多个同名子项的xml子项,python
- java - Java 流参数限制无限制(MongoDB 不一致)
- makefile - Makefile 与 Windows 资源文件的循环依赖关系