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
相关产品推荐
相关产品推荐

