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

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

1、获取变量类型

#include <typeinfo.h>

int a = 1;

typeid(a).name();

2、lambda表达式用法

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

//例如
[](int x, int y) -> int { int z = x + y; return z + x; }

int main(){
  int a = 1;
  int b = 2;
 
  auto lambda = []{return a + b;}; 
  //error! 空捕获列表,无法使用作用域内其他变量

  auto lambda = [](int a, int b){return a + b;}; 
  //success

  auto lambda = [=]{return a + b;}; 
  //success, 值传递

  auto lambda = [=]{a++; b++; return a + b;}; 
  //error! 值传递无法修改变量值

  auto lambda = [&]{a++; b++; return a + b;}; 
  //success, 引用传递

  auto lambda = [&a, b]{a++; b++; return a + b;}; 
  //error, 变量a引用传递,变量b值传递,故b不可修改

}


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

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

template<typename T>
struct isFunctor : std::false_type {
};
template<typename L, typename R, typename... Args>
struct isFunctor<R (L::*)(Args...)> : std::true_type {
};
template<typename L>
struct isLambda : isFunctor<decltype(&L::operator())> {
};

template<typename L>
std::enable_if<isLambda<L>::value> check(L lambda) {
    cout << " lambda(1, 2) = " << lambda(1, 2) << lambda(1, 2);
}
int main() {
    auto fun = [&](int a, int b) {
        a++;
        b++;
        cout << a <<"."<< b << endl;
        return pow(a, b);
    };
    check(fun);
    return 0;
}


//输出为: 2.3
//       2.3
//       lambda(1, 2) = 88

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值