boost使用详解

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;

未完待续

转载于:https://my.oschina.net/u/2930533/blog/1822453

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值