C++ 回调函数和Lambda表达式

目录

回调函数

[Lambda 表达式](#Lambda 表达式)

捕获列表


回调函数

回调函数(Callback Function)是一种被作为参数传递给其他函数的函数,其核心思想是允许函数在特定事件发生时执行预先定义好的操作。在 C++ 中,回调函数通常通过函数指针或函数对象实现。

回调函数的工作机制

函数指针作为参数:

函数指针定义了函数的签名(参数类型和返回值)。

通过函数指针,函数可以在运行时动态调用其他函数。

回调的触发时机:

主函数在特定条件下(如事件发生、数据处理完成等)调用回调函数。

回调函数的具体实现由调用者决定,实现了代码的灵活性和可扩展性。

cpp 复制代码
#include <iostream>

using namespace std;

bool compare(int a,int b){
    return a>b;
}

int getMax(int a,int b,bool(*p1)(int a,int b)){

    if(p1(a,b)) return a;
    else return b;
}

int main()
{
    int x=5,y=6;
    
    //bool (*p)(int a,int b)=compare;
    cout<<getMax(x,y,compare)<<endl;

    return 0;
}

compare 是一个回调函数,定义了比较逻辑。

getMax 的第三个参数 bool(*p1)(int a, int b) 是一个函数指针,指向返回值为 bool、接受两个 int 参数的函数。

在 main 中,compare 函数被作为参数传递给 getMax,实现了自定义比较逻辑。

Lambda 表达式

Lambda 表达式是 C++11 引入的一种匿名函数的方式,它允许你在需要函数的地方内联地定义函数,而 无需单独命名函数

cpp 复制代码
[capture clause](parameters) -> return_type {
 // 函数体
// 可以使用捕获列表中的变量
return expression; // 可选的返回语句
}

Lambda 表达式由以下部分组成:

捕获列表(Capture clause):用于捕获外部变量,在 Lambda 表达式中可以访问这些变量。捕 获列表可以为空,也可以包含变量列表 [var1, var2, ...]。

参数列表(Parameters):与普通函数的参数列表类似,可以为空或包含参数列表 param2, ...)。 (param1, 返回类型(Return type):Lambda 表达式可以自动推断返回类型auto,也可以显式指定返回类 型 > return_type。如果函数体只有一条返回语句,可以省略返回类型。

函数体(Body):Lambda 表达式的函数体,包含需要执行的代码。 Lambda 表达式最简单的案例是在需要一个小型函数或临时函数时直接使用它。

cpp 复制代码
#include <iostream>

using namespace std;


int add(int a,int b){
    return a+b;
}
int main()
{
    auto add2=[](int a,int b)->int{
        return a+b;
    };

    cout<<add(1,2)<<endl;
    cout<<add2(3,4)<<endl;
    return 0;
}

捕获列表

捕获列表=表示捕获所有外部变量,但不可写,只有捕获列表&,可读可写

cpp 复制代码
#include <iostream>

using namespace std;



int main()
{
    int x=30;
    int y=10;
    int z=5;

    //1.add 是一个包含捕获值(x 和 y)的函数对象
    auto add=[x,y]()->int{
        return x+y;
    };

    auto mul=[x,y]()->int{
        return x*y;
    };

    //2.捕获列表里面写=表示捕获所有外部变量 不可写
    auto sub=[=]()->int{
        return x-y-z;
    };


    //3.用引用的方式捕获,引用类似指针,进行地址访问 可读可写
    auto modifyAndMul=[&]()->int{
        x=15;
        return x*y*z;
    };


    cout<<add()<<endl;
    cout<<mul()<<endl;
    cout<<sub()<<endl;
    cout<<modifyAndMul()<<endl;
    return 0;
}

请注意,虽然 Lambda 函数和内联函数在某些方面有相似之处,如它们都可以被编译器优化以减少调用 开销,但它们在设计和用途上有明显的不同。Lambda 函数的核心优势在于它们的匿名性和对外部变量 的捕获能力,而内联函数则主要关注于提高小型函数的性能。

相关推荐
liulilittle41 分钟前
C++ TAP(基于任务的异步编程模式)
服务器·开发语言·网络·c++·分布式·任务·tap
励志要当大牛的小白菜2 小时前
ART配对软件使用
开发语言·c++·qt·算法
PAK向日葵3 小时前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
QQ_4376643147 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
liulilittle9 小时前
C++/CLI与标准C++的语法差异(一)
开发语言·c++·.net·cli·clr·托管·原生
小狄同学呀9 小时前
VS插件报错,g++却完美编译?API调用错因分析
c++
程序员编程指南9 小时前
Qt 数据库连接池实现与管理
c语言·数据库·c++·qt·oracle
小乖兽技术9 小时前
C#与C++交互开发系列(二十四):WinForms 应用中嵌入C++ 原生窗体
c++·c#·交互
张北北.10 小时前
【深入底层】C++开发简历4+4技能描述6
java·开发语言·c++
刚入坑的新人编程11 小时前
暑期算法训练.9
数据结构·c++·算法·leetcode·面试·排序算法