Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何知道变量是否可以直接写入二进制文件?_C++_Visual Studio_File_C++14 - Fatal编程技术网

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的现有实例。