function是函数对象的容器,它以对象的形式封装了原始的函数指针或函数对象,能够容纳任意符合函数签名的可调用对象。因此可以用于回调机制,暂时保管函数或函数对象,在之后需要的时机再调用。
声明形式
#include <boost/function.hpp>
using namespace boost;
int addFunc(int a,int b,int c)
{
return a + b + c;
}
int main()
{
//以下两种声明等价
boost::function<int (int,int,int)>func1;
boost::function<int (int a1,int a2,int a3)>func2;
//推断类型然后声明
boost::function<decltype (addFunc)> func3;
}
判空和置空
#include <boost/function.hpp>
using namespace boost;
int addFunc(int a,int b,int c)
{
return a + b + c;
}
int main()
{
boost::function<int (int,int,int)> func1;
// func1(1,2,3);//未赋值就调用,会抛出bad_function_call异常
//以下两种判空方式相等
qDebug()<<func1.empty();
qDebug()<< !func1 ;
func1 = &addFunc;
//两种置空方式
func1.clear();
func1 = 0;//不能等于nullptr
//标准库的可以等于nullptr
std::function<int (int,int,int)> func2;
func2 = nullptr;
}
使用
#include <boost/function.hpp>
#include <boost/bind.hpp>
using namespace boost;
int addFunc(int a,int b,int c)
{
return a + b + c;
}
struct demo_class
{
int add(int a, int b)
{
return a + b;
}
int operator()(int x) const
{
return x*x;
}
};
int main()
{
boost::function<int (int,int,int)> func1;
//非成员函数
func1 = &addFunc;
qDebug()<<func1(1,2,3);
//------------------------------------------
//成员函数
demo_class sc;
//方式一
boost::function<int(demo_class&, int,int)> func2;
func2 = boost::bind(&demo_class::add,_1,_2,_3);
qDebug()<<func2(sc, 10, 20);//对应三个参数
//方式二
function<int(int,int)> func3;
func3 = bind(&demo_class::add,&sc, _1, _2);
qDebug() << func3(10, 20);
//方式一的标准库版function
std::function<int(demo_class&, int,int)> func4;
func4 = std::bind(&demo_class::add,std::placeholders::_1,
std::placeholders::_2,
std::placeholders::_3);
qDebug()<<func4(sc, 10, 20);
}
使用 ref 库
使用 ref 可以以引用的方式传递对象:
struct demo_class
{
int add(int a, int b)
{
return a + b;
}
int operator()(int x) const
{
return x*x;
}
};
int main()
{
demo_class sc;
function<int(int)> func;
func = cref(sc);
std::cout << func(10);
}