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

C++中如何将函数作为可选参数传递?代码去重优化咨询

合并相似函数并支持可选转换参数的优化方案

问题拆解

你的两个旧函数MyOldFunction1和MyOldFunction2核心逻辑高度一致:都是通过std::transform对vector的每个元素执行a * 转换操作(i),唯一区别在于转换逻辑——前者直接返回i,后者调用somefunc(b, i)。我们可以通过提取通用逻辑,将转换操作作为可选参数传入,消除代码重复。

实现方案1:可读性优先(使用std::function)

这种方式语法清晰,兼容所有可调用类型(lambda、函数指针、仿函数等),适合绝大多数场景:

#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>

int somefunc(int b, int i){
    return i - b;
}

// 合并后的通用函数:func为可选参数,默认返回输入的i
std::vector<int> MyFunction(const int a,
                            std::vector<int> list,
                            std::function<int(int)> func = [](int i) { return i; }) {
    std::transform(list.begin(), list.end(), list.begin(),
                   [a, &func](int i) { return a * func(i); });
    return list;
}

// 兼容原有函数调用(可选,也可直接调用MyFunction)
std::vector<int> MyOldFunction1(const int a, std::vector<int> list) {
    return MyFunction(a, std::move(list)); // 用std::move避免vector拷贝开销
}

std::vector<int> MyOldFunction2(const int a, std::vector<int> list, const int b) {
    return MyFunction(a, std::move(list), [b](int i) { return somefunc(b, i); });
}

void PrintVector(std::vector<int> a) {
    for (const auto& val : a) {
        std::cout << val << " ";
    }
    std::cout << std::endl;
}

int main () {
    int p[] = {1, 2, 3, 4, 5};
    std::vector<int> a(p, p+5);
    PrintVector(MyOldFunction1(1, a)); // 输出:1 2 3 4 5
    PrintVector(MyOldFunction2(1, a, 1)); // 输出:0 1 2 3 4

    // 直接调用MyFunction的扩展示例
    PrintVector(MyFunction(2, a)); // 输出:2 4 6 8 10
    PrintVector(MyFunction(2, a, [](int i){return i*i;})); // 输出:2 8 18 32 50
}

实现方案2:性能优先(使用模板)

如果需要极致性能,避免std::function的类型擦除开销,可以用模板参数接收函数对象,编译器会做完全的内联优化:

#include <vector>
#include <algorithm>
#include <iostream>

int somefunc(int b, int i){
    return i - b;
}

// 模板版本,Func可接收任意可调用类型
template<typename Func = decltype([](int i){return i;})>
std::vector<int> MyFunction(const int a,
                            std::vector<int> list,
                            Func func = [](int i) { return i; }) {
    std::transform(list.begin(), list.end(), list.begin(),
                   [a, &func](int i) { return a * func(i); });
    return list;
}

// 兼容原有函数调用
std::vector<int> MyOldFunction1(const int a, std::vector<int> list) {
    return MyFunction(a, std::move(list));
}

std::vector<int> MyOldFunction2(const int a, std::vector<int> list, const int b) {
    return MyFunction(a, std::move(list), [b](int i) { return somefunc(b, i); });
}

void PrintVector(std::vector<int> a) {
    for (const auto& val : a) {
        std::cout << val << " ";
    }
    std::cout << std::endl;
}

int main () {
    int p[] = {1, 2, 3, 4, 5};
    std::vector<int> a(p, p+5);
    PrintVector(MyOldFunction1(1, a));
    PrintVector(MyOldFunction2(1, a, 1));
}

核心优化说明

  • 提取重复的std::transform逻辑到通用函数,通过可选参数实现差异化转换
  • 用std::move转移vector所有权,避免不必要的深拷贝,提升效率
  • std::function版本可读性强,支持运行时动态切换转换逻辑;模板版本无额外开销,适合性能敏感场景
  • 默认转换函数直接用lambda表达式定义,符合C++11及以上标准

内容的提问来源于stack exchange,提问作者user3710760

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:45:57