• 函数对象使用


    这两天用c++函数对象。老规矩,好记性不如烂笔头,自己记录一下
    1. c++普通函数

    int my(int a,int b)

    {

            return a + b;

    }

    function myFun = my;

    int ret = myFun(3,5);//这里ret就是8了

    2. extern "c" 函数

    extern "C" 

    {

            int my(int a, int b)

            {

                    return a+b;

            }

    }

    function myFun = my;

    int ret = myFun(3,5);//这里ret就是8了

    3. 类成员函数

    class test
    {
    private:
        int baseVal;
    public:
        int my(int a)
        {
            int ret = a + baseVal;
            return ret;
        }
        test(int val):baseVal(val)
        {
        }
    };

    test obj(100);
    function func = std::bind(&test::my,&obj,std::placeholders::_1);
    int ret = func(5);
    cout<

    4. 回调函数

    我个人理解,这个是函数对象的主战场。

    比如下面的类:

    class test
    {
    private:
        int baseVal;
        function _callback; 
    public:
        int total;
    public:
        int my(int a)
        {
            int ret = a + baseVal;
            total = ret;
            if(ret>10)
            {
                _callback(this);//触发回调
            }
            return ret;
        }
        test(int val):baseVal(val),total(val)
        {
        }
        void set(function callBackFunc)
        {
            _callback = callBackFunc;//设置回调函数
        }
    };
    我们可以设置的回调函数,可以是普通的函数,比如lamda函数:

        test obj(5);
        auto l1 = [](void* para){
            test* obj = reinterpret_cast(para);
            cout<<"lamda callback called,total is "<total<     };
        obj.set(l1);
        obj.my(6);//此时回到函数被触发,也就是lamda函数l1被触发

    回调函数也可以是我们实际设计的一个类的成员函数,比如:

    class box
    {
    private:
        int id;
        string ip;
        int load;
    public:
        box(const string& ip,const int id)
        {
            this->id = id;
            this->ip = ip;
            load = 0;
        }
        void callback1(void * para)
        {
            test* obj = reinterpret_cast(para);
            cout<<"box's call back1 is called,total is "<total<     }
    };

    比如将box类中的callback1注册到test类中:

        test obj(5);

        box myBox("192.168.1.100",123456);
        auto f2 = std::bind(&box::callback1,&myBox,std::placeholders::_1);
        obj.set(f2);
        obj.my(12);//这里box中的callback1被触发。

    并且这里,通过bind,实际上box中的callback1的形参可以不局限于(void* para)。因此,通过函数对象,以及bind,回调函数可以变得更灵活
    5. 函数指针

    以dll库中的extern  "c" 函数为例

    typedef int (*P_MY_ADD)(int,int);

    function gFun;

    int main()
    {
        void* libHandle = dlopen("libmy.so", RTLD_GLOBAL | RTLD_NOW);
        P_MY_ADD funcPtr;
        funcPtr = (P_MY_ADD)dlsym(libHandle,"myAdd");
        int ret = funcPtr(5,6);
        cout<     gFun = funcPtr;
        ret=gFun(11,12);
        cout<     return 0;
    }
     

  • 相关阅读:
    新媒体运营必备工具推荐,助力高效运营输出爆款
    【数据结构】&&【C++】封装哈希表模拟实现unordered_map和unordered_set容器
    根据上下级关系统计数据
    【性能测试】使用JMeter对code论坛进行压力测试
    Linux快速下载Google Drive数据集
    QGIS003:【04地图导航工具栏】-地图显示、新建视图、时态控制、空间书签操作
    名窑讲坛:钧瓷“神、奇、妙、绝”四大特色之“妙”——纹路
    有属性的自定义注解,如何获取到post请求中RequestBody中对象的一个属性值?
    Spark - 一文搞懂 Partitioner
    kubernetes驱逐机制总结
  • 原文地址:https://blog.csdn.net/guolisong/article/details/126075296