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

在C++14及以后的标准中,lambda表达式支持泛型参数,也就是所谓的“泛型lambda”。这种特性让lambda可以接受任意类型的参数,极大地增强了其灵活性,特别适合用于实现高阶函数。
使用auto作为参数类型是定义泛型lambda的关键。编译器会在调用时根据传入的参数类型自动推导。
基本写法如下:
[] (auto x, auto y) { return x + y; }
立即学习“C++免费学习笔记(深入)”;
这个lambda可以接收任何支持+操作的类型,比如int、double、string等。
也可以只对部分参数使用auto:
[] (auto x, int y) { return x * y; }
虽然泛型lambda不能直接赋值给模板参数未确定的std::function,但可以通过函数模板来包装。
例如,实现一个通用的高阶函数apply_operation:
template<typename F, typename T>
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<typename Func, typename T>
std::vector<decltype(std::declval<Func>()(std::declval<T>()))>
map_vector(const std::vector<T>& vec, Func f) {
std::vector<decltype(f(vec[0]))> result;
for (const auto& item : vec)
result.push_back(f(item));
return result;
}
使用泛型lambda进行转换:
std::vector<int> nums = {1, 2, 3, 4};
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配合模板,能让C++写出更简洁、复用性更高的函数式代码。不复杂但容易忽略的是类型推导时机和上下文匹配问题。
以上就是c++++中lambda表达式的泛型用法_c++泛型lambda语法与高阶函数实现的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号