lambda和std::function实现c++成员函数回调

旧的函数指针我们就不要讲了,过时了。

新的方法如下(c++11):

1、使用lambda表达式

2、结合std::bind和std::function

示例,一看就会,不看还真要找半天:

#include <stdio.h>
#include <iostream>
#include <functional>

//声明未初始化的function函数包装器
typedef std::function<void(int)> Fun;

class Bird{
public:
    Bird(){}
    
    // 我们就是想尽办法调这个move函数,还是非静态的!
    void move(int h){
        std::cout<<"I am flying:"<<h<<std::endl;
    }
};

// 调用者示例
class Caller{
public:
    void callOthers(Fun cb){
        if(cb != nullptr)
            cb(3);
    }
};

int main()
{
    Bird bird;

    //2.把实例化的对象和成员函数绑定,函数指针赋值给function
    Fun fun = std::bind(&Bird::move,&bird,std::placeholders::_1);

    // 直接调用函数
    fun(2);

    Caller call;

    // 或者传给另一个函数内部进行调用
    call.callOthers(fun);

    // 使用lambda表达式进行回调
    auto lamb = [&](int h){
        bird.move(h);
    };

    call.callOthers(lamb);
    return 0;
}

实际一句话:需要知道类对象的地址,这样就知道了类的成员地址,这样就可以调用这个函数了。

输出:

I am flying:2
I am flying:3
I am flying:3

简单吧,比那些联合函数、boost啥的简单多了

本文为3YL原创,转载无需联系,但请注明来自labisart.com。

原创文章不易,如果觉得有帮助,可打赏或点击右侧广告支持:

查看打赏记录

发表评论请遵守党国法律!后台审核后方可显示!
  • 最新评论
  • 总共0条评论
  • Blog v1.1© 2024 labisart.com 版权所有 | 联系:labartwork@163.com