【问题标题】:Invoke different functions for different file extensions为不同的文件扩展名调用不同的函数
【发布时间】:2014-06-30 16:02:08
【问题描述】:

情况如下:

我有一个用 C++ 编写的 Graph 类,我需要从 Files 构建 Graph 对象。问题是 Graph 以多种不同的方式存储在文件中,所以我正在考虑一个函数,使用文件扩展名,可以调用正确的过程来构建特定格式的 Graph。我应该如何进行?是我错了,还是我不能在课堂上重载 operator>>?提前致谢。

【问题讨论】:

标签: c++ data-structures


【解决方案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 在它的字符串算法中有一个实现。

【讨论】:

    【解决方案2】:

    您如何确定数据的存储方式。如果只是 扩展,你只需要一张地图 std::stringpointer_to_function。如果一样 扩展可以有几种不同的表示, 区分,例如,通过在前几个字节 文件或某些常见标题中的信息,您必须 在您阅读这些内容之前,最终选择不同 字节——同样,映射到指向函数的指针就可以了 诀窍。

    根据要读取的格式的复杂程度,您可能需要 将指向阅读器函数的指针替换为指向的指针 一个工厂函数,它返回一个读取器类的实例, 来源于抽象读者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      相关资源
      最近更新 更多