boost使用詳解

1. boost::any:萬能數據類型函數

#include <boost/any.hpp>this

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>code

//綁定普通函數:
     * 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;

未完待續對象

相關文章
相關標籤/搜索