Boost.Function的基本使用

Posted on 2008-06-04 14:45 RichardHe 阅读(305) 评论(0)  编辑 收藏 引用 所属分类: [转]
Boost.Function库用来提供一个对象化的函数指针。

函数指针对设计很有用。它使调用者可以延期调用,调用时机由调用者确定。而且可以改变
响应者,以应对不同的要求。

C中的函数指针只能用于自由函数。在C++中除了自由函数还有函数对象和类成员函数,这些
C的函数指针是无法用的。这要求能适应C++语言的函数指针。既然C++语言本身没有提供,
那就提供一个库。stl提供了,但是定义了很多类型,使用起来并不是很方便,而且函数参数
的个数被限定在两个以下,更能是备受限制。Boost.Function库提供了一个好的解决方案。

Boost.Function库可以支持自由函数,函数对象,类成员函数。而且参数个数多达10个。
Boost.Function库利用模板技术来实现。生成的代码有很高的运行效率。本库可以不用编译
直接使用。

Boost.Function的头文件。
function.hpp

定义一个Boost.Function的对象(是一个返回值类型为int,第一个参数是std::string类型
第二个参数是float类新)

boost::function< int ( std::string, float ) > funptr;

上面这个定义方式是一种容易理解的定义方式。但有些编译器不支持,如果想更多的编译器
支持,则用下面这种定义方式

boost::function2< int, std::string, float > funptr;

注意模板中有3个类型,而function类却是boost::function2。应为返回值类型不计算在参数
类型中(原因很简单,C++的编译器不会根据返回类型不同来区分函数定义的不同)。

int freefun( std::string str, float f )
{
    std::cout << str << " : " << f << std::endl;
    return 0;
}

class CFun
{
public:
    int operator() ( std::string str, float f )
    {
        std::cout << str << " : " << f << std::endl;
        return 0; 
    }
}

上面定义了一个自由函数和一个函数对象。下面将把他们付给function对象。

赋值为自由函数
funptr = &freefun;

赋值为函数对象
CFun fun;
funptr = fun;

以上两种情况的调用方法一致,如下
funptr( "float =", 10.0 );

Boost.Function对象要能指向类型原函数,其定义要如下

class FreeClass
{
public:
    int out( std::string str, float f )
    {
        std::cout << str << " : " << f << std::endl;
        return 0; 
    }
};

boost::function< int ( FreeClass*, std::string, float ) > funptr;

跨平台的定义方法
boost::function3< int, FreeClass*, std::string, float > funptr;

赋值方法
funptr = &FreeClass::out;

调用方法
FreeClass fc;

funptr( &fc, "float =", 10.0 );

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe