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