1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        bi-bind超小型的bind庫

        聯(lián)合創(chuàng)作 · 2023-09-28 18:52

        boost中有一個bind庫, 可以說是一個最為實用的tools了, 但是它與boost結合的有些緊密,而且其中的一些功能并不是很常用,就算將它bcp出獨立的庫也是一個不小的負擔。如果在你的項目中不打算有boost庫的痕跡但是又想使用bind的強大功能,那就來看看它吧。

        一個一個超小型的bind庫, 它實現(xiàn)了大部分boost::bind的功能, 只是將名字空間由boost 變換為 bi 。如果使用了一般的使用中通??梢詫?

        boost::bind(my_fun(), _1,_2)(234, "hello world"); 形式替換為 bi::bind(my_fun(), _1, _2)(234, "hello world"),

        既可完成編譯,如果使用了名字空間,那就只需要將 using namespace boost 替換為 using namespafce bi 即可完成轉化。

        它對一般函數(shù)、成員函數(shù), 虛擬函數(shù), 函數(shù)對象都提供了全面支持。

        但是....

        bi::bind沒有打算支持boost庫, 如果在你的項目中使用了其它的boost‘tools,那你就不需要它了(或許也可以拿來研究研究),既然使用了boost,就不在乎在使用boost::bind了,所以boost::bind中涉及到與其它boost庫的有交集的功能bi::bind庫都沒有支持。

        它自然支持 boost::shared_ptr, 同時對c++10 保標準的shared_ptr也有很好的支持。

        bi::bind借鑒了boost::bind的一些思想,有些代碼甚至是直接從bind.hpp中復制過來的,但它在犧牲一些擴展性和多平臺支持性的后果下, 同樣的代碼比boost::bind中有40%的效率提升 。

        bi-bind 同時提供了 callback功能, 它就像是一個簡化版本的 boost::function, 對一次調用行為做了抽象。

        例如:

        int fun1(int p2)
        {
           std::cout << "call fun1" << std::endl;
           return p2 *  p2;
        }
        
        struct fun2
        {
           fun2(int p1)
           {
              p_ = p1;
           }
        
           int operator()(int p2) const
           {
              return p2 * p_;
           }
        
           int p_;
        };
        
        //綁定一般函數(shù) 構造 callback
        bi::callback cb = bi::bind(&fun1, _1);
        int r = cb(2);   //r=4,使用了實際參數(shù)2
        
        //綁定仿函數(shù)對象賦值給callback
        cb = bi::bind(fun2(2), 9);
        r = cb(100);     //r=18,使用了綁定參數(shù)9
        bind 通常都接收它們的參數(shù)的拷貝, 并會在bind_t對像中保存一份相同的對象,而有些對像不具備拷貝語義或是拷貝的代價很大。 為了解決這個問題對,bind對像的可以使用ref 方式將這個對像封裝起來使用。它定義了類模板 reference_wrapper和 兩個返回實例的函數(shù) ref 和 cref。

        reference_wrapper 的目的是容納一個引向類型為 T 的對象的引用。它主要用于把引用傳給bind_t對像, bint_t對像中有對此的重載,即可以解開引用,調用實際的對像。

        struct fun2
        {
           fun2(int p1)
           {
              p_ = p1;
           }
        
           int operator()(int p2) const
           {
              return p2 * p_;
           }
        
           int p_;
        };
        
        //假設fun2的拷貝復制的負擔很大
        fun2 f(23);
        
        //使用bi::ref解除對f對像的值語義調用
        bi::bind(bi::ref(f), 9)(2);
        瀏覽 18
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        編輯 分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        編輯 分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            中文字幕久久青青 | 亚洲中文字幕网站 | 特级西西444www大胆高清无视频 | 成人先锋AV | 五月婷婷操 | 男团催眠被调教到高潮失禁bl | 欧美成人免费 | 大鸡吧操逼逼 | 手机欧美在线 | 男人操女生 |