c++ 将lambda表达式作为参数传递
  TdiUOXEvKHt9 2023年11月02日 44 0


c++ 将lambda表达式作为参数传递

1、获取变量类型


 

1. #include <typeinfo.h>
2.  
3. int a = 1;
4.  
5. typeid(a).name();

 

2、lambda表达式用法

C++11 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。Lambda 表达式本质上与函数声明非常类似。



1. [capture](parameters)->return-type{body}
2.  
3. //例如
4. [](int x, int y) -> int { int z = x + y; return z + x; }
5.  
6. int main(){
7. int a = 1;
8. int b = 2;
9.  
10. auto lambda = []{return a + b;}; 
11. //error! 空捕获列表,无法使用作用域内其他变量
12.  
13. auto lambda = [](int a, int b){return a + b;}; 
14. //success
15.  
16. auto lambda = [=]{return a + b;}; 
17. //success, 值传递
18.  
19. auto lambda = [=]{a++; b++; return a + b;}; 
20. //error! 值传递无法修改变量值
21.  
22. auto lambda = [&]{a++; b++; return a + b;}; 
23. //success, 引用传递
24.  
25. auto lambda = [&a, b]{a++; b++; return a + b;}; 
26. //error, 变量a引用传递,变量b值传递,故b不可修改
27.  
28. }
29.

 

3、将lambda表达式作为函数参数传递

想要使lambda作为参数,首先要明白他的类型,但是auto无法作为函数参数类型,使用1中获取类型方法输出为【Z4mainEUlvE_23】,根本不是类型,查阅资料,只能使用template模板来实现。

 



1. template<typename T>
2. struct isFunctor : std::false_type {
3. };
4. template<typename L, typename R, typename... Args>
5. struct isFunctor<R (L::*)(Args...)> : std::true_type {
6. };
7. template<typename L>
8. struct isLambda : isFunctor<decltype(&L::operator())> {
9. };
10.  
11. template<typename L>
12. std::enable_if<isLambda<L>::value> check(L lambda) {
13. cout << " lambda(1, 2) = " << lambda(1, 2) << lambda(1, 2);
14. }
15. int main() {
16. auto fun = [&](int a, int b) {
17. a++;
18. b++;
19. cout << a <<"."<< b << endl;
20. return pow(a, b);
21. };
22. check(fun);
23. return 0;
24. }
25.  
26.  
27. //输出为: 2.3
28. // 2.3
29. // lambda(1, 2) = 88

 


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

TdiUOXEvKHt9