泛型lambda通过auto参数实现类型自动推导,可灵活用于高阶函数。例如[](auto x, auto y) { return x + y; }能处理多种类型,结合模板函数如apply_operation或map_vector可实现通用操作,提升代码复用性。

在C++14及以后的标准中,lambda表达式支持泛型参数,也就是所谓的“泛型lambda”。这种特性让lambda可以接受任意类型的参数,极大地增强了其灵活性,特别适合用于实现高阶函数。
泛型Lambda的基本语法
使用auto作为参数类型是定义泛型lambda的关键。编译器会在调用时根据传入的参数类型自动推导。
基本写法如下:
[] (auto x, auto y) { return x + y; }
这个lambda可以接收任何支持+操作的类型,比如int、double、string等。
也可以只对部分参数使用auto:
[] (auto x, int y) { return x * y; }
结合std::function使用泛型lambda
虽然泛型lambda不能直接赋值给模板参数未确定的std::function,但可以通过函数模板来包装。
例如,实现一个通用的高阶函数apply_operation:
template
T apply_operation(F op, T a, T b) {
return op(a, b);
}
调用示例:
auto add = [] (auto x, auto y) { return x + y; };
auto result1 = apply_operation(add, 3, 4); // int
auto result2 = apply_operation(add, 2.5, 3.7); // double
实现更复杂的高阶函数
利用泛型lambda,可以轻松实现如map、filter这类函数式编程中的高阶函数。
例如,实现一个简单的map函数:
template
std::vector
map_vector(const std::vector
std::vector
for (const auto& item : vec)
result.push_back(f(item));
return result;
}
使用泛型lambda进行转换:
std::vector
auto squares = map_vector(nums, [] (auto x) { return x * x; });
auto strings = map_vector(nums, [] (auto x) { return "num:" + std::to_string(x); });
注意事项与限制
泛型lambda本质是一个包含函数调用操作符模板的闭包类。每次调用时,编译器会为不同的参数类型生成对应的实例。
需要注意:
- 不能将泛型lambda赋值给没有明确模板参数的std::function变量
- 在递归lambda中使用auto需谨慎,可能无法捕获自身
- 错误信息在模板推导失败时可能较难阅读
基本上就这些。泛型lambda配合模板,能让C++写出更简洁、复用性更高的函数式代码。不复杂但容易忽略的是类型推导时机和上下文匹配问题。









