1. boost::any:万能数据类型
#include <boost/any.hpp>
std::vector<boost::any> vec;
template<class mT>
void VarEqu(mT& pVar, const boost::any& mAn)
{
pVar = boost::any_cast<mT>(mAn);
}
2.boost::bind:非常庞大的函数家族
#include <boost\bind.hpp>
//绑定普通函数:
* 1.bind(f,_1,9)(x); //f(x,9)
* 2.bind(f,_1,_2)(x,y); //f(x,y)
* 3.bind(f,_2,_1)(x,y); //f(y,x)
* 4.bind(f,_1,_1)(x,y); //f(x,x)
* 5.bind(g,_1,_8,_2)(x,y); //g(x,8,y)
* 6.bind(g,_3,_2,_2)(x,y,z); //g(z,y,y)*/
//绑定函数指针:
f_type fp = f;
g_type fg = g;
int x = 1,y = 2,z = 3;
cout << bind(fp,_1,18)(x) << endl;
cout << bind(fg,_1,_3,_3)(x,y,z) << endl;
//绑定成员函数:
* 绑定类的成员函数必须牺牲一个占位符的位置
* 进而通过对象作为第一个参数来调用第一个成员函数
* 因为成员函数指针不能直接调用operator(),必须绑定到
* 一个对象或指针,通过this指针来调用
*
demo a,&ra = a; //类的实例或引用
demo *p = &a; //指针
//注意:在成员函数之前必须加上取地址操作符,以表明其是成员函数指针,否则编译无法通过
cout << bind(&demo::f,a,_1,20)(80) << endl;
cout << bind(&demo::f,ra,_2,_1)(20,10) << endl;
cout << bind(&demo::f,p,_1,_1)(30,30) << endl;
//绑定成员变量:
* bind对类的另一个操作是public成员变量,其可以有选择地去操作一些成员变量*/
typedef pair<int,string> pis_t;
pis_t pp(12,"xiaoming");
cout << bind(&pis_t::first,pp)();
cout << bind(&pis_t::second,pp)() << endl;
//绑定函数对象:
* 若函数有内部类型定义result_type,bind可以进行自动推导;
* 否则需要在编写时增加typedef result_type工作
* */
cout << bind<int>(func(),_1,_2)(10,20) << endl;
//与ref的配合:
* bind是采用拷贝的方式来存储对象和参数,开销较大,为了减少这种开销,我们可以搭配ref库
* 一起使用,但是这可能会引起bind的调用延后。若调用时引用的变量或者函数对象被销毁,那么
* 结果未知*/
int m = 30;
cout << bind(g,_1,cref(m),ref(m))(10) << endl;
cout << bind<int>(ref(f),_1,_2)(10,20) << endl;
未完待续