码迷,mamicode.com
首页 > 其他好文 > 详细

boost--function

时间:2017-09-09 20:58:28      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:参数   语义   gif   div   set   调用   get   成员函数   c++   

1、简介

  function是一个模板类,它就像一个包装了函数指针或函数对象的容器(只有一个元素)。可以把它想象成一个泛化的函数指针,而且他非常适合代替函数指针,存储用于回调的函数。如下定义了一个能够容纳void(int)类型的function对象:

function<void(int)> funo;

  使用function需要包含头文件"boost/function.hpp",C++11已经支持function。

  一些成员函数:

  target():返回对象内部的可调用物Functor的指针,对象为空则返回NULL
  contains():检测是否持有一个Functor。
  clear():将对象清空,与"= 0"效果相同。
  empty():测试对象是否为空,也可以在一个bool上下文中直接测试它是否为空。
  operator==、operator!=:与一个函数或函数对象进行比较。
  operator():调用内部的可调用物,它也会将参数传给可调用物。

2、简单使用

技术分享
int FuncName(int a, int b)
{
    return a + b;
}

int main()
{
    function<int(int, int)> funo;
    funo = FuncName;
    if (funo)
    {
        cout << funo(3, 4) << endl;
    }

    return 0;
}
View Code

  除了普通函数,function对象中也可以存储函数对象(包括bind表达式的结果)、类的成员函数。

3、用于回调

  ①、存储普通函数

  以下为在CTestClass类中使用function对象m_fFun来保存回调函数和调用回调函数的示例:

技术分享
void call_back_func(int i)
{
    cout << i << endl;
}

class CTestClass
{
public:
    CTestClass(int i) :m_iNum(i) {}
public:
    template<typename CallBack>
    void SetCallBack(CallBack f)
    {
        m_fFun = f;
    }
    void run()
    {
        if(m_fFun)
            m_fFun(m_iNum);
    }
private:
    function<void(int)> m_fFun;
    int m_iNum;
};

int main()
{
    CTestClass dc(10);
    dc.SetCallBack(call_back_func);
    dc.run();

    return 0;
}
View Code

  ②、存储函数对象

  使用function来存储函数对象是function中最有用的功能,因为相比于使用普通函数回调,使用函数对象回调可以保存数据和实现复杂的操作。以下为在CTestClass类中使用function对象m_fFun来保存回调函数对象和调用回调函数对象的示例:

技术分享
#include "boost/bind.hpp"
class CFunObj
{
public:
    CFunObj(int i) :x(i) {}
public:
    void operator()(int i)
    {
        cout << i * x++ << endl;
    }
private:
    int x;
};

class CTestClass
{
public:
    CTestClass(int i) :m_iNum(i) {}
public:
    template<typename CallBack>
    void SetCallBack(CallBack f)
    {
        m_fFun = f;
    }
    void run()
    {
        if (m_fFun)
            m_fFun(m_iNum);
    }
private:
    function<void(int)> m_fFun;
    int m_iNum;
};

int main()
{
    CTestClass dc(10);
    CFunObj cfo(2);
    dc.SetCallBack(ref(cfo));
    dc.run();
    dc.run();

    return 0;
}
View Code

  function使用拷贝语义来保存函数或函数对象,当函数或函数对象很复杂或者禁止拷贝的时候可以使用ref以解决拷贝的代价和问题。可以看到,以上代码就是使用ref库来传递引用。

  ③、存储类的成员函数

  以下我们定义了一个函数工厂类,回调函数都在这个工厂类中定义,我们可以配合bind来保存类中的回调函数,然后通过fiunction对象再调用类中的回调函数:

技术分享
#include "boost/bind.hpp"
class CCall_back_factory
{
public:
    void call_back_fun_1(int i)
    {
        cout << i * 2 << endl;
    }
    void call_bcak_fun_2(int i, int j)
    {
        cout << i * j * 2 << endl;
    }
};

class CTestClass
{
public:
    CTestClass(int i) :m_iNum(i) {}
public:
    template<typename CallBack>
    void SetCallBack(CallBack f)
    {
        m_fFun = f;
    }
    void run()
    {
        if(m_fFun)
            m_fFun(m_iNum);
    }
private:
    function<void(int)> m_fFun;
    int m_iNum;
};

int main()
{
    CTestClass dc(10);
    CCall_back_factory cbf;
    
    dc.SetCallBack(bind(&CCall_back_factory::call_back_fun_1, cbf, _1));
    dc.run();

    int j = 5;
    dc.SetCallBack(bind(&CCall_back_factory::call_bcak_fun_2, cbf, _1, j));
    dc.run();

    return 0;
}
View Code

   通过以上代码可以看到,function用于回调再配合bind可以使无需改变回调的接口就可以解耦客户代码,始终保证与客户代码的正确沟通。

 

boost--function

标签:参数   语义   gif   div   set   调用   get   成员函数   c++   

原文地址:http://www.cnblogs.com/milanleon/p/7498849.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!