泛型lambda是c++++14引入的特性,允许参数使用auto类型,由编译器自动推导具体类型。1. 它可用于stl算法中简化代码,例如一个lambda可同时用于int和double排序;2. 避免显式模板定义,如统一的打印函数;3. 支持多参数auto类型,适用于不同类型比较;但需注意不能跨类型混用、返回值类型须一致及调试时不易查看实际类型,此外可结合decltype(auto)保留返回值引用语义。
C++14引入了对泛型lambda表达式的支持,也就是允许lambda的参数使用
auto
下面是一些使用带
auto
泛型lambda是指lambda表达式的参数类型是
auto
立即学习“C++免费学习笔记(深入)”;
例如:
auto func = [](auto x) { return x + x; };
这个lambda可以接受任何类型的参数,只要该类型支持
+
在处理容器的时候,我们经常需要写一些简单的函数对象,比如排序、查找等。泛型lambda可以让我们避免为每种类型单独写函数或函数对象。
示例:
std::vector<int> vi = {3, 1, 4}; std::vector<double> vd = {2.5, 1.2, 3.7}; std::sort(vi.begin(), vi.end(), [](auto a, auto b) { return a > b; }); std::sort(vd.begin(), vd.end(), [](auto a, auto b) { return a > b; });
这里一个lambda就可以同时用于int和double的排序,不需要分别写两个函数或模板函数。
有时候你可能想写一个通用的转换或者包装逻辑,但又不想自己去写完整的模板类或函数。这时候泛型lambda就很有用了。
比如你想写一个统一的打印函数:
auto print = [](auto&& val) { std::cout << val << std::endl; }; std::for_each(vi.begin(), vi.end(), print); std::for_each(vd.begin(), vd.end(), print);
泛型lambda也可以有多个参数,每个都可以是
auto
auto compare = [](auto a, auto b) { return a < b; };
这样的lambda可以用于不同类型之间的比较(当然前提是这些类型之间确实可以比较)。
不能跨类型混用:虽然lambda的参数是
auto
比如下面这个lambda,在遇到字符串时就会出错:
auto add = [](auto a, auto b) { return a + b; };
如果传入的是
std::string*
返回值类型必须一致:如果lambda返回的值类型依赖于输入参数的类型,那么所有路径的返回值类型最好能一致,否则可能会导致编译错误。
调试时不容易看到实际类型:因为lambda是编译器自动生成的匿名类,所以在调试器里看变量类型可能会不太直观。
decltype(auto)
如果你希望lambda返回的类型也能自动推导,并且保留引用语义,可以使用
decltype(auto)
auto get = [](auto& container, int index) -> decltype(auto) { return container[index]; };
这样可以在不显式指定返回类型的情况下,保留返回值的引用特性。
基本上就这些。泛型lambda是个很实用的小工具,尤其是在快速开发和写回调函数的时候。不过要注意它的适用范围,别让它变成“万能”却不可控的黑盒。
以上就是C++14的泛型lambda如何使用 带auto参数的lambda表达式技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号