以下是这种情况:
我有一个用C ++编写的Graph类,我需要从Files构建Graph对象。问题是Graph以很多不同的方式存储在文件中,所以我在考虑一个函数,使用文件扩展名,可以调用以某种格式构建Graph的正确过程。我该怎么办?我错了还是我不能重载运算符>>在我班上?提前谢谢。
答案 0 :(得分:1)
operator>>
(应该)与它所提取的流的任何细节无关,因此使用此运算符可能是错误的机制。
最好的方法是:
graph_type load_from_file(const std::string& file_path) { //or use something like boost::filesystem::path
std::ofstream file { file_path };
if(endswith(file_path, ".graph") {
return deserialize_from_graph(ofstream);
}
if(endswith(file_path, ".g2") {
return deserialize_from_g2(ofstream);
}
//other formats here
//else throw
}
注意,endswith不是来自标准库,但是boost有一个实现它的字符串算法。
答案 1 :(得分:0)
如何确定数据的记忆方式。如果只是
扩展,您只需要一张地图
std::string
→ pointer_to_function 。如果相同
扩展可以有几种不同的表示形式,
例如,通过前几个字节来区分
文件或某些常见标题中的信息,您必须这样做
在您阅读这些内容之前,最终的选择是不同的
bytes-again,一个指向函数的指针的映射
诀窍。
根据要阅读的格式的复杂程度,您可能需要 用指针替换指向reader函数的指针 一个工厂函数,它返回一个读者类的实例, 它来自一个抽象的读者。