You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 04:11:16