C++11 lambda 表达式作用在传统C回调函数上

//--std=c++11
#include <functional>
#include <cstdio>

typedef bool (*IS_X_NUM)(int);

void show_x_num(int * array, int len, IS_X_NUM is_x_num)
{
    for(int i = 0; i < len; i++) {
        if(is_x_num(array[i])) {
            printf("%d ", array[i]);
        }
    }
    printf("\n");
}

void show_x_num2(int * array, int len, std::function<bool(int)> is_x_num)
{
    for(int i = 0; i < len; i++) {
        if(is_x_num(array[i])) {
            printf("%d ", array[i]);
        }
    }
    printf("\n");
}

int main() {
    int list[] = { 2, 3, 5, 8, 19, 20, 21 };

    printf("show all:\t");
    show_x_num(list, 7, [](int){return true;});

    printf("show even num:\t");
    show_x_num(list, 7, [](int a){return !(a % 2);});

    int two = 2;
    printf("show even num:\t");

    //show_x_num(list, 7, [=](int a){return !(a % two);});
    //error: cannot convert ‘main()::__lambda2’ to ‘IS_X_NUM {aka bool (*)(int)}’ for argument ‘3’ to ‘void show_x_num(int*, int, IS_X_NUM)’

    show_x_num2(list, 7, [=](int a){return !(a % two);});

    return 0;
}

上面的例子中,show_x_num 的第3个参数是一个传统的函数指针,我们可以使用不带捕获([captrue])的lambda表达式作为show_x_num的第3个参数(第31行和第34行),但使用带捕获的lambda就会编译出错(第39行).

如果要使用带捕获的lambda,需把函数参数声明成 std::function<>  (第17行), 第42行使用带捕获的lambda就成功了.

之所以会这样(带捕获的lambda表达式无法转化为传统函数指针),我理解带捕获的lambda实际上增加了参数。

时间: 2024-10-11 18:05:00

C++11 lambda 表达式作用在传统C回调函数上的相关文章

C++11 lambda表达式学习

lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的lambda表达式自己的认识.这里有参考文档http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2927.pdf 给出两个例子,可以看出lambda表达式的写法 [](int x, int y) { return x + y; } [](int x, int y) -> int {

C++11 Lambda表达式简单解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 很多语言都提供了 lambda 表达式,如 Python,Java 8 lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capture ] ( params ) mutable

Python Special Syntax 11: lambda表达式

lambdTesting=lambda x: x*3 print(lambdTesting(5)) 输出 15 像C#一样传递lambda表达式: def abc(t,a): return t(a) print(abc(lambdTesting,15)) 输出:45 Python Special Syntax 11: lambda表达式,布布扣,bubuko.com

C++11 lambda 表达式解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lambda 表达式. 很多语言都提供了 lambda 表达式,如 Python,Java 8.lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式. C++11 的 lambda 表达式规范如下: [ capt

c++11——lambda表达式

lambda表达式 函数式编程的一个语法,有如下优点: (1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.以更直接的方式写程序,好的可读性和可维护性. (2)简洁:不需要额外再写一个函数或者函数对象,避免了代码膨胀和功能分散. (3)在需要的时间和地点实现功能闭包,使程序更灵活. lambda表达式基本概念和用法 lambda表达式定义了一个匿名函数,并且可以捕获一定范围的变量.lambda表达式的语法如下: [capture] (params) opt

C++11 Lambda 表达式

1. 匿名函数 匿名函数是一些拥有函数体,但没有函数名的函数.Lambda是一种与匿名函数相关的编程技术,但需要说明的是Lambda表达式得到的不是一个匿名函数,而是一个函数对象.MSDN:Lambda隐式定义函数对象类并构造该类类型的函数对象. 2. Lambda语法 C++11 Lambda 表达式

c++11 lambda表达式

c++11新增的lambda表达式特性. lambda用来表示只调用一次的小函数[=]表示取值 [&]表示取引用()表示函数的形参{}函数体,函数体前的类型为返回值类型 1 PH::runOnMainThread([=](){ 2 PH::runOnMainThread([=]() 3 { 4 // UI Scene 5 director->replaceScene(PH::LoadingScreen::create(useHighRes)); 6 }); 7 });

C++11 lambda表达式(19篇C++11文章)

C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问. Lambda表达式的语法通过下图来介绍: 这里假设我们定义了一个如上图的lambda表达式.现在来介绍途中标有编号的各个部分是什么意思. Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式:‘=’表明以值传递的方式捕获,除

(11) lambda表达式用法

* lambda 简述    lambda只是一个表达式,函数体比def简单很多    lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去.    lambda表达式是起到一个函数速写的作用.允许在代码内嵌入一个函数的定义    lambda可以有多个参数列表    lambda表达式也叫匿名函数    * 简单例子   result = lambda x:x+3   求一个数加3的结果      fun = lambda x,y:x*y   求两个