Boost库的function是一组函数对象包装类的模板,实现了一个泛型的回调机制。Boost库的function与函数指针相比,优点在于它允许用户在目标的实现上拥有更大的弹性,即目标既可以是普通函数(自由函数),也可以是函数对象和类成员函数,而且可以给函数添加状态。
使用Boost库的function,可以很好地与现有的代码融合在一起。另外,function还可以与Boost库的bind和lambda配合使用,从而极大地扩展了function的适用范围。function库支持的函数参数个数最多为10个,其头文件为function.hpp或functionX.hpp(其中,X为0到10之间的整数)。如果你的程序中只使用了X个参数的function,那么你可以只包含对应的functionX.hpp,当然,你也可以只包含function.hpp(它包含了所有的functionX.hpp)。
下面介绍function库的具体用法。
◆ 普通函数(自由函数)用法
int Add(int x, int y)
{
return x+y;
}
function<int (int,int)> f; // 或者 function2<int, int, int> f;
f = Add;
cout << "f(2, 3)=" << f(2, 3) << endl;
其中,模板参数的第1个int为返回值类型,后两个int为参数类型。
◆ 函数对象用法
class CStudent
{
public:
void operator() (string strName, int nAge)
{
cout << strName << " : " << nAge << endl;
}
};
function<void (string, int)> f; // 或者 function2<void, string, int> f;
CStudent stu;
f = stu;
cout << "f(\"hello\", 25)=" << f("hujian", 25) << endl;
◆ 成员函数用法
struct TAdd
{
int Add(int x,int y)
{
return x+y;
}
};
TAdd tAdd;
function<int (tAdd *,int,int)> f; // 或者 function<int (tAdd &,int,int)> f;
f = & TAdd::Add;
cout << f(&tAdd, 2, 3); // 如果前面的模板参数为值或引用,直接传入tAdd即可
其中,模板参数的tAdd *为类的实例的指针,当然也可以传入类的实例或其引用,只不过调用时需要做相应的修改。
使用function时,可以通过empty函数或与0比较来判断其是否指向一个有效的函数。如果function没有指向一个有效的函数,调用时会抛出bad_function_call的异常。function的clear函数可以使其不再关联到一个函数或函数对象,如果该function本身就是空的,调用该函数也不会带来任何问题。
转载 http://www.cnblogs.com/hujian/archive/2009/06/04/1495813.html
如有版权问题,请联系QQ: 858668791