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