posts - 58,  comments - 75,  trackbacks - 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 );


posted on 2007-07-18 13:28 walkspeed 阅读(10558) 评论(2)  编辑 收藏 引用 所属分类: STL、Boost、范型编程C++语言

FeedBack:
# re: Boost.Function的基本使用
2008-02-13 11:05 | stlf
不错, 文章写得很清晰!  回复  更多评论
  
# re: Boost.Function的基本使用
2008-03-28 10:27 | Ason Jia
写的是不错,不过内容太少了,要是再多一些,可以整理成一片初级指南  回复  更多评论
  

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



<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

常用链接

留言簿(4)

随笔分类(64)

随笔档案(58)

文章分类(3)

文章档案(3)

相册

收藏夹(9)

C++零碎

好友

搜索

  •  

积分与排名

  • 积分 - 159662
  • 排名 - 163

最新评论

阅读排行榜

评论排行榜