function+bind

2022-02-08  本文已影响0人  _张鹏鹏_

目的:

本节记录的是学习muduo源码和相关博客过程中,个人积累的一些代码片段,方便查询。
按照原文所讲,基于对象(Object Based)的编程风格面向对象(Object Oriented)的编程风格在拓展性上更好。

bind基本用法:

#include <functional>
#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>

using namespace std;
using namespace std::placeholders;

class test
{
public:
    test(int i):m_i(i){}
    void add(const int step)
    {
        m_i = m_i + step;
    }

    void print()
    {
        cout << m_i << endl;
    }
private:
    int m_i;
};


void add(const int step, int & elem)
{
    elem = elem + step;
}

int main(int argc, char ** argv)
{
    vector<test*>  v{&test(2), &test(5), &test(4), &test(7)};

    for_each(v.begin(), v.end(), std::bind(&test::add, _1, 10));

    for_each(v.begin(), v.end(), std::bind(&test::print, _1));

    vector<int> vint{1,3,4,5,7};
    for_each(vint.begin(), vint.end(), std::bind(add, 10, _1));
    for_each(vint.begin(), vint.end(), [](const int &elem){
        cout << elem << endl;
    });
    system("pause");
    return 0;
}

如果没有boost::bind,那么boost::function就什么都不是,而有了bind(),“同一个类的不同对象可以delegate给不同的实现,从而实现不同的行为”,简直就无敌了。

struct Server{
    typedef function < void() > sendCallBack;
    void send()
    {
        if (sendcb)
        {
            sendcb();
        }
        else
        {
            cout << "default send" << endl;
        }
    }

    void setSendCallBack(const sendCallBack& cb)
    {
        sendcb = cb;
    }
private:
    sendCallBack sendcb;
};

void send1()
{
    cout << "send1" << endl;
}

void send2()
{
    cout << "send2" << endl;
}

struct Sender{
    void send(int i)
    {
        cout << "Sender send..." <<i<< endl;
    }
};

int main(int argc, char ** argv)
{
    // s1 s2 s3是Server类的不同对象,其发送行为send委托给不同的实现
    Server s1;
    s1.setSendCallBack(std::bind(send1));
    s1.send();
    // 绑定到自由函数
    Server s2;
    s2.setSendCallBack(send2);
    s2.send();
    // 绑定到类的成员函数
    Server s3;
    Sender s;
    s3.setSendCallBack(std::bind(&Sender::send,&s, 100));
    s3.send();

    system("pause");
    return 0;
}

参考文献:

  1. 以boost::function和boost:bind取代虚函数
  2. Large-concurrent-serve
  3. MuduoStudy
上一篇 下一篇

猜你喜欢

热点阅读