boost:function

来源:互联网 发布:c语言 戏说关键字 ppt 编辑:程序博客网 时间:2024/05/01 15:54
1. 介绍

    Boost.Function库包含了一个类族的函数对象的包装。它的概念很像广义上的回调函数。其有着和函数指针相同的特性但是又包含了一个调用的接口。一个函数指针能够在能以地方被调用或者作为一个回调函数。boost.function能够代替函数指针并提供更大的灵活性。

    Boost库的function是一组函数对象包装类的模板,实现了一个泛型的回调机制。Boost库的function与函数指针相比,优点在于,它允许用户在目标的实现上拥有更大的弹性,即目标函数既可以是普通函数(自由函数),也可以是函数对象和类成员函数,而且可以给函数添加状态。

2. 使用

    使用Boost库的function,可以很好地与现有代码融合在一起。另外,function还可以与Boost库的bind和lambda配合使用,从而极大地扩展了function的适用范围。function库支持的函数参数个数最多为10个,其头文件为function.hpp或functionX.hpp(其中,X为0~10之间的整数。)如果你的程序中只使用了X个参数的function,那么你可以只包含对应的functionX.hpp,当然你也可以只包括function.hpp(它包含了所有的function.hpp)。

    Boost.Function有两种形式:boost::function<float(int x, int y)>f,其中第一个模板参数是返回值类型,后两个为参数类型。

    使用类型: 普通函数, 成员函数, 函数对象。
    使用function时,可以通过empty函数或与0比较来判断其是否指向一个有效的函数。如果function没有指向一个有效的函数,调用时会抛出bad_function_call的异常。function的clear函数可以使其不再关联到一个函数或函数对象,如果该function本身就是空的,调用该函数也不会带来任何问题。

3.例子

#include <iostream>#include <algorithm>#include <assert.h>#include <boost/bind/bind.hpp>#include <boost/shared_ptr.hpp>#include <boost/function.hpp>using namespace std;int fsum(int i, int j){return i + j;}class Person{public:void operator() (std::string name, int age){std::cout << name << ": " << age << std::endl;}};class Car{public:Car(){}virtual ~Car(){}void info(int i){std::cout << "info = " << i << std::endl;}};void test_function(){// 1. 普通函数boost::function<int(int, int)> func1;func1 = fsum;std::cout << "4 + 5 = " << func1(4, 5) << std::endl;// 2. 函数对象boost::function<void(std::string, int)> func2;Person person;func2 = person;func2("myname", 30);// 3. 成员函数boost::function<void(Car*, int)> func3;func3 = &Car::info;Car car;func3(&car, 25);// 4. 空函数boost::function<int(int, int)> func4;assert(func4.empty());assert(!func1.empty());func1.clear();assert(func1.empty());try{func1(4, 5);}catch (std::exception& e){std::cout << e.what() << std::endl;}}int main(){test_function();system("pause");return 0;}

http://blog.csdn.net/huang_xw/article/details/8249278

0 0
原创粉丝点击