C++ 如何知道变量是否可以直接写入二进制文件?
我编写了这个函数:C++ 如何知道变量是否可以直接写入二进制文件?,c++,visual-studio,file,c++14,C++,Visual Studio,File,C++14,我编写了这个函数: template <typename T> ofstream bfwrite(ofstream &os, const T &data) { os.write(reinterpret_cast<char*>(data), sizeof(data)); return os; } 模板 流写入(流和操作系统、常量和数据){ 写入(重新解释(数据),大小(数据)); 返回操作系统; } 我知道这对某些类型不起作用,因为,例如
template <typename T>
ofstream bfwrite(ofstream &os, const T &data) {
os.write(reinterpret_cast<char*>(data), sizeof(data));
return os;
}
模板
流写入(流和操作系统、常量和数据){
写入(重新解释(数据),大小(数据));
返回操作系统;
}
我知道这对某些类型不起作用,因为,例如,它们指向堆上的数据。
所以我想做一个编译时检查,但在引用中找不到合适的函数
有三种选择:是可复制的,是pod
,或者只是使用其他人的序列化库。当你学习一门语言时,你所能做的一切都是别人做的,所以我会坚持使用前两种选择之一。
非常容易复制
对我来说足够安全。更多细节请参见公认答案。你需要的是特质
<平凡可复制类型的对象是唯一的C++对象
可以使用std::memcpy安全复制,也可以在二进制文件中序列化
使用std::ofstream::write()/std::ifstream::read()
具体而言,我强调:
一般来说
普通可复制类型是基础字节可以复制的任何类型
将复制到字符数组或无符号字符数组中,并复制到新对象中
相同类型,并且生成的对象将具有相同的值
和原作一样
模板
流写入(流和操作系统、常量和数据)
{
静态断言(std::is_littlely_copyable::value,“T必须是littlely copyable”);
写入(重新解释(数据),大小(数据));
返回操作系统;
}
或者,如果需要,可以这样做:
template <typename T>
typename std::enable_if<std::is_trivially_copyable<T>::value,
ofstream>::type bfwrite(ofstream &os, const T &data)
{
os.write(reinterpret_cast<char*>(data), sizeof(data));
return os;
}
模板
typename std::enable_if::type bfwrite(流和操作系统、常量和数据)
{
写入(重新解释(数据),大小(数据));
返回操作系统;
}
你需要的是特质
<平凡可复制类型的对象是唯一的C++对象
可以使用std::memcpy安全复制,也可以在二进制文件中序列化
使用std::ofstream::write()/std::ifstream::read()
具体而言,我强调:
一般来说
普通可复制类型是基础字节可以复制的任何类型
将复制到字符数组或无符号字符数组中,并复制到新对象中
相同类型,并且生成的对象将具有相同的值
和原作一样
模板
流写入(流和操作系统、常量和数据)
{
静态断言(std::is_littlely_copyable::value,“T必须是littlely copyable”);
写入(重新解释(数据),大小(数据));
返回操作系统;
}
或者,如果需要,可以这样做:
template <typename T>
typename std::enable_if<std::is_trivially_copyable<T>::value,
ofstream>::type bfwrite(ofstream &os, const T &data)
{
os.write(reinterpret_cast<char*>(data), sizeof(data));
return os;
}
模板
typename std::enable_if::type bfwrite(流和操作系统、常量和数据)
{
写入(重新解释(数据),大小(数据));
返回操作系统;
}
对于任意类,这是无法做到的。所以该语言不支持这一点?然后我必须为每个stl类编写重载,用户必须继续为自己的类编写重载。)-:不要重新发明轮子?对于STL来说,有很多方法……而用户为自己的数据类型编写序列化是标准做法。@Timon您为什么需要知道?你打算应用设计缺陷吗?@TimonPaßlick Stackoverflow不是论坛。不要在标题中添加“已解决”之类的内容。读这本书。在使用之前先了解网站。对于任意类,这是无法做到的。所以语言不支持这一点?然后我必须为每个stl类编写重载,用户必须继续为自己的类编写重载。)-:不要重新发明轮子?对于STL来说,有很多方法……而用户为自己的数据类型编写序列化是标准做法。@Timon您为什么需要知道?你打算应用设计缺陷吗?@TimonPaßlick Stackoverflow不是论坛。不要在标题中添加“已解决”之类的内容。读这本书。在使用之前先了解一下这个网站。我已经看过了,很接近,但不幸的是,这还不够我想要的。不管怎样,谢谢你的回答。嗯,怎么会呢?你希望哪种类型的数据流不是简单的可复制的?我原以为它不适用于2d数据结构,但我错了。我再次测试了它,现在,它工作了。我的第一次测试出错了。。可以将这些对象保存到文件中。只是不能保证你能以你想要的方式检索它们。只要你正确地保存这些位,并使用相同版本的编译器、平台等,这是有保证的。您可能需要使用memcpy将其反序列化为“alligned storrage”,或者更自然地将其转换为现有的T实例。我已经看过了,很接近,但不幸的是,这还不够满足我的需要。不管怎样,谢谢你的回答。嗯,怎么会呢?你希望哪种类型的数据流不是简单的可复制的?我原以为它不适用于2d数据结构,但我错了。我再次测试了它,现在,它工作了。我的第一次测试出错了。。可以将这些对象保存到文件中。只是不能保证你能以你想要的方式检索它们。只要你正确地保存这些位,并使用相同版本的编译器、平台等,这是有保证的。您可能需要使用memcpy将其反序列化为“alligned storrage”,或者更自然地将其反序列化为T的现有实例。