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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Register_man/article/details/71330743

猜你喜欢

转载自blog.csdn.net/Windgs_YF/article/details/81185051