• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            boost::bind介紹

            boost::bind介紹
            bind的中文翻譯是"綁定",它的作用就是把參數(shù)與象函數(shù)一樣的"東西"進(jìn)行"綁定",然后象
            函數(shù)一樣運(yùn)行.那象函數(shù)一樣的"東西"到底是什么東西呢?
            象函數(shù)一樣的"東西"還挺多的.
            int f1();
            free function,這當(dāng)然是一種.
            int C::method();
            某個(gè)class的method,當(dāng)然也是一種.
            typedef int (*pfunc)();
            pfunc = f1;
            函數(shù)指針,也是一種.
            class C
            {
            public:
            void operator()();
            };
            C obj;
            obj(); //這是什么?看上去象函數(shù)調(diào)用.
            //它等于 obj.()() --- 如此怪異的東西
            //第一個(gè)()是函數(shù)名稱,第二個(gè)()才是函數(shù)調(diào)用符
            上面的class C有個(gè)標(biāo)準(zhǔn)名稱,functor.自然它也屬于象函數(shù)一樣的"東西".
            大概就這么點(diǎn)了吧,其他的反正現(xiàn)在是想不起來(lái)了,或許boost::function實(shí)現(xiàn)的"委托"也算一種
            (不敢肯定,還沒(méi)研究).
            下面看看bind是怎樣把參數(shù)依次與各個(gè)象函數(shù)一樣的"東西""綁定"的.
            1. bind free function
            int add(int x, int y)
            {
            return x + y;
            }
            add(1, 2) <===> boost::bind(add, 1, 2)
            int add1(int x)
            { <===> boost::bind(add, _1, 1)(x);
            return add(x, 1); 其中 _1 是placehold(占位符),會(huì)被x所取代
            }
            add(x, y) <===> boost::bind(add, _1, _2)(x, y);
            <===> boost::bind(add, _2, _1)(y, x);
            add(x, x) <===> boost::bind(add, _1, _1)(x, y)
            <===> boost::bind(add, _2, _2)(y, x)
            C Add(const C &objX, cinst C &objY)
            <===> boost::bind(Add, boost::cref(_1), boost::cref(_2))(objX, objY)
            由于是非buildin type, 所以通過(guò)reference可能更有效率.默認(rèn)情況下boost::bind的參數(shù)都是copy一份,不是很
            有效率.
            2. bind functor
            struct F
            {
            int operator()(int a, int b) { return a - b; }
            bool operator()(long a, long b) { return a == b; }
            };
            F f;
            int x = 104;
            bind<int>(f, _1, _1)(x); // f(x, x), i.e. zero
            bind<int>(F(), _1, _1)(x); //F()是匿名object
            3. bind class method
            struct X
            {
            bool f(int a);
            };
            X x;
            shared_ptr<X> p(new X);
            int i = 5;
            bind(&X::f, boost::ref(x), _1)(i); //x.f(i)
            bind(&X::f, x, _1)(i); //x_copy = x, x_copy.f(i), 效率沒(méi)有上一行代碼高
            bind(&X::f, &x, _1)(i); //(&x)->f(i),索性傳指針
            bind(&X::f, p, _1)(i); //p是smart pointer object,所以也有copy動(dòng)作
            //p_copy = p, p_copy->f(i)
            bind(&X::f, boost::ref(p), _1)(i); //比上面一行,高效一點(diǎn)
            4. Misc.
            add(add(1, 2), add(3, 4) <===> boost::bind(add, boost::bind(add, 1, 2), boost::bind(add, 3, 4))
            boost::bind支持嵌套
            bind的返回值呢?

            posted on 2007-01-08 15:40 大龍 閱讀(10406) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            伊人久久大香线蕉精品| 伊人久久综合无码成人网| 日产精品99久久久久久| 思思久久好好热精品国产| 亚洲精品tv久久久久| 狠狠久久综合伊人不卡| 93精91精品国产综合久久香蕉| 国产精品久久久久9999| 国产成人无码久久久精品一| 久久精品国产亚洲av高清漫画| 精品久久久久久中文字幕人妻最新 | 国产亚洲婷婷香蕉久久精品| 国产成人精品白浆久久69| 夜夜亚洲天天久久| 久久电影网| 97久久国产露脸精品国产| 久久无码人妻一区二区三区午夜| 国产美女久久精品香蕉69| 亚洲国产精品热久久| 久久久久国产精品麻豆AR影院| 欧美久久一级内射wwwwww.| 日本国产精品久久| 色综合久久久久综合体桃花网| 久久最近最新中文字幕大全| 久久久精品国产亚洲成人满18免费网站 | 热久久最新网站获取| 中文无码久久精品| 久久91综合国产91久久精品| 久久精品无码一区二区三区免费| 精品国产乱码久久久久软件| 97精品国产91久久久久久| 久久九九久精品国产| 精品久久久久久国产| 99久久精品国产毛片| 精品久久久久久久国产潘金莲| 99久久精品费精品国产一区二区| 久久国产午夜精品一区二区三区| 中文字幕乱码人妻无码久久| 久久久国产精华液| 色偷偷888欧美精品久久久| 亚洲国产美女精品久久久久∴ |