boost—— 函数与回调function

时间:2020-11-29 04:42:35
/*function是一个函数对象的"容器",它以对象的形式封装了原始的函数指针或函数对象,
* 能够容纳任意符合函数签名的可调用对象。function也是一个大的类家族,可以容纳0
* -10个参数的函数,有多达11个类,分别是function1...function10。
*
* function使用result_of的方式,因此我们不需要再模板参数列表中写出被容纳函数原型
* 的返回值和所有函数参数的类型。例如:
* function<int()> func; //声明了一个返回值为int,无参的function对象
* 若编译器不兼容,可以采用兼容语法,在function类名中指定参数数量:
* 例如:
* 1.function0<int> func;
* 2.function3<int int,int,int> func2
*
* function摘要:
* template<typename Signature>
* class function:public functionN<R,T1,T2...,,TN>
* {
* public:
* //内部类型定义
* typedef R result_type;
* typedef TN argN_type;
* //参数个数数量
* static const int arity = N;
* //构造函数
* function();
* template<typename F> function(F);
* //基本操作
* void swap(const function&);
* void clear();
* bool empty() const;
* operator safe_bool() const;
* bool operator!() const;
* //访问内部元素
* template<typename Functor> Functor* target();
* template<typename Functor> const Functor* target() const;
* template<typename Functor> bool contains(const Functor&) const;
* const std::type_info& target_type() const;
* result_type operator()(arg1_type,...,argN_type) const;
*
* };
* */



#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <boost/assign.hpp>

using namespace boost::assign;
using namespace boost;
using namespace std;

int f(int a,int b)
{
return (a + b);
}
struct demo_class
{
int add(int a,int b)
{
return (a+b);
}
int operator()(int x) const
{
return (x*x);
}
};


template<typename T>
struct summary
{
typedef void result_type;
T sum;
summary(T v = T()):sum(v){

}
void operator()(T const& x)
{
sum += x;
}
};


int main( int argc,char **argv)
{
/*比较操作:
* 重载了"=="和"!="操作符*/

function<int(int,int)> func(f);
assert(func == f);
if(func)
{
cout << func(10,90) << endl;
}
func = 0;
assert(func.empty()); //function清空,相当于clear

//在函数类型中仅写出成员函数的签名,bind时直接绑定类的实例
function<int (int,int)> func1;
demo_class sc;
func1 = bind(&demo_class::add,&sc,_1,_2);
cout << func1(10,20) << endl;

//在声明函数类型时直接指定类的类型,然后bind绑定
function<int(demo_class&,int,int)> func2;
func2 = bind(&demo_class::add,_1,_2,_3);
cout << func2(sc,20,30) << endl;

/*function直接调用ref包装的函数对象*/
vector<int> iv = list_of(1)(2)(3)(4);
summary<int> s; //有状态的函数对象
function<void(int const&)> func10(ref(s)); //function包装引用
std::for_each(iv.begin(),iv.end(),func10);
cout << s.sum << endl; //函数对象的状态被改变

return (0);
}