IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> muduo网络库——关于boost::function和boost::bind的使用 -> 正文阅读

[C++知识库]muduo网络库——关于boost::function和boost::bind的使用

1. 基础用法

boost::function就像C#里面的delegate,可以指向任何函数,包括成员函数。当用bind把某个成员函数绑定到某个对象上时,我们就得到了一个闭包(closure)。

class Foo
{
public:
    void methodA();
    void methodInt(int a);
    void methodString(const string& str);
};

class Bar
{
public:
    void methodB();
}

boost::function<void()> f1; //无参数,无返回值

Foo foo;
f1 = boost::bind(&Foo::methodA, &foo);
f1();  //执行methodA()

Bar bar;
f1 = boost::bind(&Bar::methodB, &bar);
f1();  //执行methodB()

f1 = boost::bind(&Foo::methodInt, &foo, 5);
f1();  //执行methodInt(5)

f1 = boost::bind(&Foo::methodString, &foo, "Hello");
f1();  //执行methodString("Hello")

auto f2 = boost::bind(&Foo::methodInt, &foo, _1);
f2(12);  //执行methodInt(12)

2. 基于boost::function的线程设计

class Thread
{
public:
    typedef boost:function<void()> ThreadCallback;

    Thread(ThreadCallback cb)
        : cb_(cb)
    {

    }

    void start()
    {
        
    }

private:
    void run()
    {
        cb_();
    }

    ThreadCallback cb_;
}

使用方式:

class Foo   //无需继承
{
public:
    void runInThread();
    void runInAnotherThread(int);
}

Foo foo;
Thread t1(boost::bind(&Foo::runInThread, &foo));
Thread t2(boost::bind(&Foo::runInAnotherThread, &foo, 12));

t1.start();
t2.start();

个人理解:

这里主要是为了解耦,继承往往带来的问题就是强耦合。如果你熟悉Qt,马上可以联想到QThread的使用。一个类继承Qthread,然后重写虚函数run()。

class childThread : public QThread
{
public:
    ...
    virtual void run();
    ...
}

class Foo
{
    ...
private:
    std::shared_ptr<childThread > m_thread = nullptr; //定义一个智能指针类使用
}

3. muduo网络库的设计

书中给出了如下示例:

class connection;
class NetServer : boost::noncopyable
{
public:
    typedef boost::function<void (Connection*)> ConnectionCallback;
    typedef boost::function<void (Connection*, const void*, int len)> MessageCallback;

    NetServer(uint16_t port);
    ~NetServer();

    void registerConnectionCallback(const ConnectionCallback&);
    void registerMessageCallback(const MessageCallback&);
    void sendMessage(Connection*, const void* buf, int len);

private:
    ...
};

使用:

class EchoService
{
public:
    typedef boost::function<void(Connection*, const void*, int)> SendMessageCallback;
    
    EchoService(const SendMessageCallback& sendMsgCb)
        : sendMessageCb_(sendMsgCb)
    {

    }

    void onMessage(Connection* conn, const void* buf, int size)
    {
        sendMessageCb_(conn, buf, size);
    }

    void onConnection(Connection* conn)
    {
        
    }

private:
    SendMessageCallback sendMessageCb_;
};

int main()
{
    NetServer server(7);
    EchoService echo(boost::bind(&NetServer::sendMessage, &server, _1, _2, _3));
    server.registerMessageCallback(boost::bind(&EchoService::onMessage, &echo, _1, _2, _3));
    server.registerConnectionCallback(boost::bind(&EchoService::onConnection, &echo, _1));

    server.run();
}

说明:

boost库是muduo网络库依赖的第三方库,在c++11标准出来之后,新增了std::function和std::bind,功能与boost::function和boost::bind相同。详细介绍请参考我之前的文章:https://blog.csdn.net/www_dong/article/details/107946889

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 22:56:44  更:2021-07-14 22:57:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 1:44:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码