C++ 绑定Lambda表达式到回调函数

本文介绍了如何在C++中将Lambda表达式绑定到回调函数,包括向void*参数传递Lambda指针、使用Lambda适配器以及将Lambda转换为函数指针的方法。通过示例代码展示了如何提升代码的简洁性和可读性。
摘要由CSDN通过智能技术生成

Lambda表达式

Lambda表达式,简称Lambda,是C++11标准的新特性。Lambda是定义匿名函数对象(function object)的简便方式,通常作为参数传递给算法或异步方法。本文讨论如何传递Lambda到含有函数指针类型参数的函数。
有关Lambda Expression的详细内容,请参考:Lambda Expressions in C++
有关Function Object的详细内容,请参考:Function Objects in the C++ Standard Library

回调函数

考虑Unix系统一个创建线程的API:

int pthread_create(pthread_t* thread, 
		   const pthread_attr_t* attr, 
		   void* (*start_routine)(void*), 
	           void* arg)

pthread_create创建新的线程,新线程从回调函数指针start_routine指向的函数开始执行,第四个参数arg是传递给回调函数的参数。为了便于讨论和编写演示代码,先设计下面这个函数:

void do_work(void (*work_routine)(void*), void* arg)
{
   
    cout << "begin work" << endl;
    work_routine(arg);
    cout << "end   work" << endl;
}

do_work与pthread_create类似,有一个回调函数指针参数和传递给回调函数的void*参数。如果回调函数需要多个参数,可以用结构体存放这些参数。参考下面的示例代码:

// 连接字符串s1和s2,结果存入s3
struct string_join_args
{
   
    const char* s1;
    const char* s2;
    string& s3;
};

void string_join_routine(void* arg)
{
   
    string_join_args* args = (string_join_args*)arg;
    args->s3 = args->s1;
    args->s3 += args->s2;
}

void example1()
{
   
    const char* s1 = "example1_s1_";
    const char* s2 = "s2";
    string s3;
    string_join_args args = {
    s1, s2, s3 };
    do_work(string_join_routine, &args);
    cout << "s3 : " << s3 << endl;
}

绑定Lambda表达式到回调函数

上面的代码繁琐,可读性差。如果可以向do_work传递Lambda表达式,那么代码会变得简洁和易于阅读,像下面这样:

do_work([=, &s3](){
   
    s3 = s1;
    s3 += s2;
}, ...);

除了函数指针和成员指针, void*能与其它任何类型的指针相互转换。因此可以向void*参数传递Lambda指针或Lambda包装器指针,并编写相应的回调函数调用Lambda,以实现上述效果。

方案一:向void*参数传递Lambda指针

如果向函数的void*参数传递Lambda指针并在函数中调用此Lambda,必须显示地转换void*为它实际所指向的Lambda类型的指针。下面的示例代码演示void*和Lambda指针的相互转换:

void example2()
{
   
    int x = 2;
    auto lambda = [x](int y) {
   
        return x + y;
    };
    void* pv = &lambda;                                    // Lambda指针转换成void*
    auto lambdaptr = static_cast<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值