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

            ACG狂人

            其實(shí)我更愛(ài)姐汁...

            boost::bind綁定成員函數(shù)時(shí),第一個(gè)參數(shù)傳遞對(duì)象的特殊情況

            boost::bind(&memberfunction, obj, _1, _2........)類(lèi)似這樣的用法,我們叫做成員函數(shù)綁定,boost庫(kù)的文檔中說(shuō)的很清楚,第一個(gè)參數(shù)可以是value、pointer和reference,即傳值、傳地址和傳引用都是可以的,所以在一般情況下,下面三種使用bind的形式都是成立的。

            class A
            {
            public:
                
            void func();
            }
            ;


            A a;
            A
            & r = a;

            boost::bind(
            &A::func, a);
            boost::bind(
            &a::func, &a);
            boost::bind(
            &a::func, r);

            由上面的代碼可以看出,我們可以隨便傳任意一種類(lèi)對(duì)象的形式,函數(shù)模板會(huì)自動(dòng)尋找最為匹配的為我們實(shí)現(xiàn)。但是有兩種情況是特殊的,即:
            1、該對(duì)象不可進(jìn)行拷貝構(gòu)造函數(shù)。
            2、該對(duì)象不可隨意被析構(gòu)。
            發(fā)現(xiàn)這個(gè)問(wèn)題是在我編寫(xiě)單件模式時(shí)的遇見(jiàn)的,當(dāng)時(shí)發(fā)現(xiàn)我的單件對(duì)象在bind中被析構(gòu)了一次,這很不尋常,為什么bind會(huì)調(diào)用第一個(gè)參數(shù)的析構(gòu)呢?跟蹤進(jìn)了boost的源碼才發(fā)現(xiàn),原來(lái)所有的參數(shù)都會(huì)被拷貝一遍,然后析構(gòu)一遍,這樣一來(lái),我們傳遞參數(shù)的時(shí)候就會(huì)有一些小麻煩了,首先必須保證參數(shù)能夠被拷貝而不影響邏輯和數(shù)據(jù)一致性,其次,參數(shù)能夠被析構(gòu)而不影響邏輯和數(shù)據(jù)一致性。單件是全局性質(zhì)的數(shù)據(jù),所以絕對(duì)不可以析構(gòu),那么這種情況的話(huà),我們只好傳遞單件對(duì)象的地址,而不能傳遞值或引用。

            另:附上出錯(cuò)問(wèn)題的代碼如下
            class InputDevice
                : 
            public EventSource
                , 
            public Singleton<InputDevice>
            {
            public:
                
            }
            ;

            class TestUI
                : 
            public Singleton<TestUI>
            {
            public:
                
            ~TestUI(){
                    std::cout
            <<"~TestUI"<<std::endl;
                }

                
            void processKeyboard(EventArgs& args){
                    std::cout
            <<"鍵盤(pán)響應(yīng)"<<std::endl;
                }


                
            void processMouse(EventArgs& args){
                    std::cout
            <<"鼠標(biāo)響應(yīng)"<<std::endl;
                }

            }
            ;


            int _tmain(int argc, _TCHAR* argv[])
            {
                
            new FrameUpdaterManager;
                
            new DelayEventSender;
                
            new InputDevice;
                
            new TestUI;

                InputDevice::getSingleton().mEventSet.addEvent(
            "KeyDown", Event());
                InputDevice::getSingleton().mEventSet.addEvent(
            "KeyUp", Event());
                InputDevice::getSingleton().mEventSet.addEvent(
            "MouseLDown", Event());
                InputDevice::getSingleton().mEventSet.addEvent(
            "MouseLUp", Event());
                InputDevice::getSingleton().mEventSet.addEvent(
            "MouseRDown", Event());
                InputDevice::getSingleton().mEventSet.addEvent(
            "MouseRUp", Event());


                
            //TestUI& ui = TestUI::getSingleton(); // 用此行便會(huì)出錯(cuò)
                TestUI* ui = TestUI::getSingletonPtr();

                
            // 出錯(cuò)開(kāi)始
                InputDevice::getSingleton().mEventSet["KeyDown"+= boost::bind(&TestUI::processKeyboard, ui, _1);
                InputDevice::getSingleton().mEventSet[
            "KeyUp"+= boost::bind(&TestUI::processKeyboard, ui, _1);

                InputDevice::getSingleton().mEventSet[
            "MouseLDown"+= boost::bind(&TestUI::processMouse, ui, _1);
                InputDevice::getSingleton().mEventSet[
            "MouseLUp"+= boost::bind(&TestUI::processMouse, ui, _1);
                InputDevice::getSingleton().mEventSet[
            "MouseRDown"+= boost::bind(&TestUI::processMouse, ui, _1);
                InputDevice::getSingleton().mEventSet[
            "MouseRUp"+= boost::bind(&TestUI::processMouse, ui, _1);


                delete TestUI::getSingletonPtr();
                delete InputDevice::getSingletonPtr();
                delete DelayEventSender::getSingletonPtr();
                delete FrameUpdaterManager::getSingletonPtr();
                
            return 0;
            }

            posted on 2009-06-15 22:34 釀妹汁 閱讀(5782) 評(píng)論(4)  編輯 收藏 引用 所屬分類(lèi): C++

            評(píng)論

            # re: boost::bind綁定成員函數(shù)時(shí),第一個(gè)參數(shù)傳遞對(duì)象的特殊情況 2009-06-16 00:14 一個(gè)無(wú)聊的人

            為啥不用boost::mem_fn ?  回復(fù)  更多評(píng)論   

            # re: boost::bind綁定成員函數(shù)時(shí),第一個(gè)參數(shù)傳遞對(duì)象的特殊情況 2009-06-16 08:27 董波

            6.2. Requirements for Call Wrapper Types
            TR1 defines some additional terms that are used to describe requirements for callable types.

            First, INVOKE(fn, t1, t2, ..., tN) describes the effect of calling a callable object fn with the arguments t1, t2, ..., tN. Naturally, the effect depends on the type of the callable object. INVOKE is defined as follows:

            (t1.*fn)(t2, ..., tN) when fn is a pointer to a member function of a class T and t1 is an object of type T or a reference to an object of type T or a reference to an object of a type derived from T

            ((*t1).*fn)(t2, ..., tN) when fn is a pointer to a member function of a class T and t1 is not one of the types described in the previous item

            t1.*fn when fn is a pointer to member data of a class T and t1 is an object of type T or a reference to an object of type T or a reference to an object of a type derived from T

            (*t1).*fn when fn is a pointer to member data of a class T and t1 is not one of the types described in the previous item

            fn(t1, t2, ..., tN) in all other cases

            What this amounts to is that when the callable object is an ordinary function or a pointer to an ordinary function, INVOKE means to call that function, passing the rest of the arguments to the function call. When the callable object is a pointer to member, the next argument refers to the object that it should be applied to. That argument is the object itself, a reference to the object, a pointer to the object, or some kind of smart pointer that points to the object. The rest of the arguments are passed to the function call.

            Second, INVOKE_R(fn, t1, t2, ..., tN, Ret) describes the effect of calling a callable object fn with an explicit return type, Ret. It is defined as INVOKE(fn, t1, t2, ..., tN) implicitly converted to Ret.[5]

            [5] In the TR, this metafunction is named INVOKE; although I'm one of the people responsible for this name overloading, I've now concluded that it's too clever and shouldn't be used.

            Third, some call wrapper types have a weak result type; this means that they have a nested member named result_type that names a type determined from the call wrapper's target type, Ty.

            If Ty is a function, reference to function, pointer to function, or pointer to member function, result_type is a synonym for the return type of Ty

            If Ty is a class type with a member type named result_type, result_type is a synonym for Ty::result_type

            Otherwise, result_type is not defined[6]

            [6] That is, not defined as a consequence of having a weak result type. Some call wrapper types have a weak result type in certain circumstances, have a specific type named result_type

            A few examples will help clarify what this rather dense text means:

            struct base {
            void f();
            int g(double);
            int h(double,double);
            };
            struct derived : base {
            };

            base b;
            derived d;
            base& br = d;



            With these definitions, rule 1 gives the following meanings to these uses of INVOKE .

            Phrase
            Meaning

            INVOKE (&base::f, b)
            (b.*f)()

            INVOKE (&base::g, d, 1.0)
            (d.*f)(1.0)

            INVOKE (&base::h, br, 1.0, 2.0)
            (br.*f)(1.0, 2.0)





            That is, the pointer to member function is called on the object or reference named by t1:

            derived *dp = new derived;
            base *bp = dp;
            shared_ptr<base> sp(bp);



            With these additional definitions, rule 2 gives the following meanings to these uses of ( INVOKE):

            Phrase
            Meaning

            INVOKE (&base::f, bp)
            ((*bp).*f)()

            INVOKE (&base::g, dp, 1.0)
            ((*dp).*f)(1.0)

            INVOKE (&base::h, sp, 1.0, 2.0)
            ((*sp).*f)(1.0, 2.0)





            That is, the pointer to member function is called on the object that the argument t1 points to. Since it uniformly dereferences that argument, the rule works for any type whose operator* returns a reference to a suitable object. In particular, the rule works for shared_ptr objects.

            Rules 3 and 4 give similar meanings to INVOKE uses that apply pointers to member data:

            void func(base&);
            struct fun_obj {
            void operator()() const;
            bool operator()(int) const;
            };
            fun_obj obj;



            With these additional definitions, rule 5 gives the following meanings to these uses of INVOKE:

            Phrase
            Meaning

            INVOKE (func, d)
            func(d)

            INVOKE (obj)
            obj()

            INVOKE (obj, 3)
            obj(3)


              回復(fù)  更多評(píng)論   

            # re: boost::bind綁定成員函數(shù)時(shí),第一個(gè)參數(shù)傳遞對(duì)象的特殊情況 2009-06-16 23:25 wp

            文檔上有說(shuō)明  回復(fù)  更多評(píng)論   

            # re: boost::bind綁定成員函數(shù)時(shí),第一個(gè)參數(shù)傳遞對(duì)象的特殊情況 2009-06-19 14:49

            哎!我沒(méi)耐心看完文檔,有點(diǎn)操之過(guò)急了,呵呵,得接受這個(gè)教訓(xùn)  回復(fù)  更多評(píng)論   

            国产精品一区二区久久精品无码| 亚洲中文字幕伊人久久无码| 99久久国产综合精品麻豆| 国内精品久久久久影院优| 天天综合久久久网| 日本加勒比久久精品| 亚洲精品无码久久久影院相关影片| 久久免费的精品国产V∧| 99热都是精品久久久久久| 狠狠色噜噜色狠狠狠综合久久| 久久电影网2021| 超级97碰碰碰碰久久久久最新| 久久97精品久久久久久久不卡| 三级韩国一区久久二区综合| AAA级久久久精品无码片| 大香伊人久久精品一区二区| 国产成人久久777777| 久久精品人成免费| 99久久综合国产精品免费| 国产精品无码久久综合网| 国产成人久久AV免费| 久久天天躁狠狠躁夜夜不卡| 91精品无码久久久久久五月天 | 精品久久久久久久| 人妻无码精品久久亚瑟影视| 99久久精品无码一区二区毛片| 久久久久亚洲AV片无码下载蜜桃| 久久婷婷是五月综合色狠狠| 国产精品日韩欧美久久综合| 2021少妇久久久久久久久久| av色综合久久天堂av色综合在 | 久久成人精品视频| 色欲av伊人久久大香线蕉影院| 欧美久久久久久午夜精品| 国产精品伊人久久伊人电影| 国产精品美女久久久久网| 久久精品毛片免费观看| 久久久久久久人妻无码中文字幕爆| 久久午夜福利无码1000合集| 91麻豆国产精品91久久久| 亚洲精品无码久久不卡|