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

xiaoxiao2021-02-28  60

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://www.6miu.com/read-75979.html

最新回复(0)