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