基于C++17合并相似存储函数,实现可变参数统一调用
合并相似函数实现多调用方式的方案
你的两个函数核心逻辑高度重合,仅每行输出格式不同,结合C++17特性,可以通过函数重载+提取公共逻辑的方式实现合并,既能支持两种调用形式,又能彻底消除代码冗余。
步骤1:提取公共文件写入逻辑
先把两个函数中重复的文件操作部分抽成独立辅助函数,避免重复编写:
#include <fstream> #include <sstream> #include <vector> #include <string> namespace detail { void write_to_file(const std::string& savepth, std::stringstream& ss) { ss.clear(); ss.seekg(0, std::ios::beg); std::ofstream fout(savepth, std::ios::out); if (fout.is_open()) { fout << ss.rdbuf(); } // ofstream析构时会自动关闭文件,无需手动调用close() } } // namespace detail
注:原代码中
ss >> fout.rdbuf()是错误写法,应该用fout << ss.rdbuf()(将流内容输出到文件而非输入),同时手动close属于冗余操作。
步骤2:实现重载的save_func
基于公共逻辑,编写两个重载函数分别处理两种参数场景:
// 仅保存keys的版本 void save_func(const std::string& savepth, const std::vector<std::string>& keys) { std::stringstream ss; const size_t n_samples = keys.size(); if (n_samples == 0) { detail::write_to_file(savepth, ss); return; } for (size_t i = 0; i < n_samples - 1; ++i) { ss << keys[i] << '\n'; } ss << keys[n_samples - 1]; detail::write_to_file(savepth, ss); } // 保存keys和values的版本 void save_func(const std::string& savepth, const std::vector<std::string>& keys, const std::vector<int>& values) { std::stringstream ss; const size_t n_samples = keys.size(); // 添加参数合法性校验 if (n_samples == 0 || values.size() != n_samples) { detail::write_to_file(savepth, ss); return; } for (size_t i = 0; i < n_samples - 1; ++i) { ss << keys[i] << ',' << values[i] << '\n'; } // 修正原代码的越界问题:循环结束后i等于n_samples,直接用n_samples-1索引 ss << keys[n_samples - 1] << ',' << values[n_samples - 1]; detail::write_to_file(savepth, ss); }
调用示例
现在可以直接按需求调用两种形式:
// 仅保存keys std::vector<std::string> keys = {"user1", "user2", "user3"}; save_func("keys.txt", keys); // 保存keys和对应数值 std::vector<int> scores = {90, 85, 95}; save_func("key_scores.txt", keys, scores);
进阶:通用模板版本(可选)
如果未来需要支持更多类型的values(比如double、std::string),可以用模板替换第二个重载,实现更通用的逻辑:
template <typename T> void save_func(const std::string& savepth, const std::vector<std::string>& keys, const std::vector<T>& values) { std::stringstream ss; const size_t n_samples = keys.size(); if (n_samples == 0 || values.size() != n_samples) { detail::write_to_file(savepth, ss); return; } for (size_t i = 0; i < n_samples - 1; ++i) { ss << keys[i] << ',' << values[i] << '\n'; } ss << keys[n_samples - 1] << ',' << values[n_samples - 1]; detail::write_to_file(savepth, ss); }
内容的提问来源于stack exchange,提问作者Zeyu Zhang CN
相关产品推荐
相关产品推荐

