boost--function

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;
}

除了普通函数,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;
}

②、存储函数对象

使用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;
}

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;
}

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

时间: 2024-10-19 11:11:12

boost--function的相关文章

boost::bind boost::function

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 #include <boost/bind.hpp> #include <boost/function.hpp> #include <iostream&g

boost::function 介绍

本片文章主要介绍boost::function的用法. boost::function 就是一个函数的包装器(function wrapper),用来定义函数对象. 1.  介绍 Boost.Function 库包含了一个类族的函数对象的包装.它的概念很像广义上的回调函数.其有着和函数指针相同的特性但是又包含了一个调用的接口.一个函数指针能够在能以地方被调用或者作为一个回调函数.boost.function能够代替函数指针并提供更大的灵活性. 2. 使用 Boost.Function 有两种形式

#include &lt;boost/function.hpp&gt;

为atoi取别名fun,fun实质上是函数指针 1 #include <iostream> 2 #include <boost/function.hpp> 3 4 void main() 5 { 6 boost::function<int(char *)>fun = atoi;//为atoi取别名fun,fun实质上是函数指针 7 8 std::cout << fun("123") + fun("234") <&

boost::function实践——来自《Beyond the C++ Standard Library ( An Introduction to Boost )》

代码段1: 1 #include <boost/function.hpp> 2 #include <iostream> 3 4 5 float mul_ints(int x, int y) { return ((float)x) * y; } 6 struct int_div { 7 float operator()(int x, int y) const { return ((float)x)/y; }; 8 }; 9 10 int main() 11 { 12 boost::f

以boost::function和boost:bind取代虚函数

转自:http://blog.csdn.net/Solstice/archive/2008/10/13/3066268.aspx 这是一篇比较情绪化的blog,中心思想是"继承就像一条贼船,上去就下不来了",而借助boost::function和boost::bind,大多数情况下,你都不用上贼船. boost::function和boost::bind已经纳入了std::tr1,这或许是C++0x最值得期待的功能,它将彻底改变C++库的设计方式,以及应用程序的编写方式. Scott

关于boost::function与boost::bind函数的使用心得

最近开始写一个线程池,期间想用一个通用的函数模板来使得各个线程执行不同的任务,找到了Boost库中的function函数. Boost::function是一个函数包装器,也即一个函数模板,可以用来代替拥有相同返回类型,相同参数类型,以及相同参数个数的各个不同的函数. 1 #include<boost/function.hpp> 2 #include<iostream> 3 typedef boost::function<int(int ,char)> Func; 4

[转] boost::function用法详解

http://blog.csdn.net/benny5609/article/details/2324474 要开始使用 Boost.Function, 就要包含头文件 "boost/function.hpp", 或者某个带数字的版本,从 "boost/function/function0.hpp" 到 "boost/function/function10.hpp". 如果你知道你想保存在 function 中的函数的参数数量,这样做可以让编译器

boost::function用法详解

要开始使用 Boost.Function, 就要包含头文件 "boost/function.hpp", 或者某个带数字的版本,从 "boost/function/function0.hpp" 到 "boost/function/function10.hpp". 如果你知道你想保存在 function 中的函数的参数数量,这样做可以让编译器仅包含需要的头文件.如果包含 "boost/function.hpp", 那么就会把其它的

函数指针&amp;绑定: boost::functoin/std::function/bind

boost::functoin/std::function可用于所有 () operator 操作的对象(函数,类,成员函数,lambda表达式等等).用处就是可以使用一个函数指针调用不用的函数实体(只要他们的signature一样),实现回调函数,或者多种不同的算法等等. 很好的例子:原文链接 #include <functional> #include <iostream> using namespace std; std::function< int(int)>

boost库之bind(与function配合使用)

// FirstTest.cpp : 定义控制台应用程序的入口点. //bind(&mem,&obj, _1):类成员方法地址,对象地址,_1是占位符 //同一个类的不同对象可以delegate给不同的实现,从而实现不同的行为(myan语) #include "stdafx.h" #include <boost/function.hpp> #include <boost/bind.hpp> #include <string> #inc