青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ACG狂人

其實我更愛姐汁...

boost::bind綁定成員函數時,第一個參數傳遞對象的特殊情況

boost::bind(&memberfunction, obj, _1, _2........)類似這樣的用法,我們叫做成員函數綁定,boost庫的文檔中說的很清楚,第一個參數可以是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);

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

另:附上出錯問題的代碼如下
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
<<"鍵盤響應"<<std::endl;
    }


    
void processMouse(EventArgs& args){
        std::cout
<<"鼠標響應"<<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(); // 用此行便會出錯
    TestUI* ui = TestUI::getSingletonPtr();

    
// 出錯開始
    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 釀妹汁 閱讀(5839) 評論(4)  編輯 收藏 引用 所屬分類: C++

評論

# re: boost::bind綁定成員函數時,第一個參數傳遞對象的特殊情況 2009-06-16 00:14 一個無聊的人

為啥不用boost::mem_fn ?  回復  更多評論   

# re: boost::bind綁定成員函數時,第一個參數傳遞對象的特殊情況 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)


  回復  更多評論   

# re: boost::bind綁定成員函數時,第一個參數傳遞對象的特殊情況 2009-06-16 23:25 wp

文檔上有說明  回復  更多評論   

# re: boost::bind綁定成員函數時,第一個參數傳遞對象的特殊情況 2009-06-19 14:49

哎!我沒耐心看完文檔,有點操之過急了,呵呵,得接受這個教訓  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产亚洲毛片| 国产精品免费福利| 亚洲高清免费视频| 欧美91大片| 久久在线免费视频| 亚洲激情影院| 日韩网站在线观看| 国产精品美女在线| 久久蜜桃精品| 欧美高清在线一区| 亚洲性图久久| 欧美一区在线直播| 亚洲精品美女久久久久| 日韩天堂在线视频| 国产欧美在线观看一区| 欧美成人一区二免费视频软件| 毛片av中文字幕一区二区| 日韩视频不卡中文| 午夜精品www| 亚洲国产精品久久久久婷婷老年 | 久久天天躁狠狠躁夜夜爽蜜月| 欧美一区二区三区啪啪| 亚洲国产视频直播| 亚洲综合国产| 最新高清无码专区| 亚洲一区二区视频在线观看| 黄色日韩网站| 一区二区三区成人精品| 激情综合亚洲| 一区二区三区日韩| 在线看欧美日韩| 亚洲午夜精品一区二区三区他趣| 黄色成人免费观看| 亚洲午夜精品国产| 亚洲乱码国产乱码精品精98午夜| 午夜久久tv| 宅男噜噜噜66一区二区| 久久大逼视频| 午夜精品美女自拍福到在线| 欧美gay视频| 欧美一区二区三区在线看| 欧美激情视频一区二区三区不卡| 久久av红桃一区二区小说| 欧美国产日本| 你懂的国产精品| 国产人久久人人人人爽| 亚洲人成艺术| 亚洲国产精品日韩| 欧美一区=区| 亚洲欧美国产77777| 欧美激情第1页| 开元免费观看欧美电视剧网站| 国产精品成人国产乱一区| 亚洲第一页自拍| 在线观看精品一区| 午夜在线a亚洲v天堂网2018| 亚洲一区在线播放| 欧美日韩中文字幕精品| 亚洲日本免费电影| 日韩视频免费观看高清在线视频| 久久精品视频在线播放| 久久精品一区四区| 国模精品一区二区三区| 性欧美18~19sex高清播放| 亚洲欧美国产高清va在线播| 欧美日韩在线视频一区| 亚洲精品网址在线观看| 日韩香蕉视频| 欧美日韩视频在线一区二区| 亚洲精品国精品久久99热| 亚洲美女视频在线观看| 欧美精品一区二区三区蜜臀| 亚洲电影下载| 一区二区三区四区五区精品| 欧美日韩国产小视频| 日韩视频在线观看一区二区| 亚洲特色特黄| 国产日韩欧美黄色| 久久精品人人| 欧美成年人视频网站| 亚洲另类自拍| 欧美性理论片在线观看片免费| 亚洲午夜激情免费视频| 久久久精品国产免大香伊| 狠狠色狠狠色综合人人| 美女尤物久久精品| 亚洲精品视频免费| 性欧美大战久久久久久久久| 国产亚洲精品资源在线26u| 久久精品99国产精品日本| 欧美va天堂va视频va在线| 日韩小视频在线观看| 国产精品扒开腿做爽爽爽软件| 午夜精品久久久久久久99樱桃| 久热精品视频| 在线亚洲免费| 国产有码一区二区| 欧美激情第3页| 亚洲免费在线观看视频| 农夫在线精品视频免费观看| 国产精品99久久久久久久久久久久| 国产精品狼人久久影院观看方式| 欧美在线欧美在线| 亚洲卡通欧美制服中文| 久久久国产视频91| 亚洲网站在线播放| 激情久久久久久| 欧美午夜无遮挡| 久久久青草青青国产亚洲免观| 亚洲国产婷婷| 久久久精品2019中文字幕神马| 亚洲美女在线观看| 国产日韩欧美综合| 欧美日韩三区| 免费91麻豆精品国产自产在线观看| 99视频一区二区三区| 欧美 日韩 国产 一区| 亚洲欧美在线免费| 亚洲免费观看在线观看| 韩国v欧美v日本v亚洲v| 国产精品va在线播放| 欧美刺激性大交免费视频| 性一交一乱一区二区洋洋av| 亚洲精品一区二区三区不| 欧美成人综合| 久久亚洲国产成人| 久久国产一区二区三区| 亚洲午夜精品一区二区三区他趣| 亚洲电影在线免费观看| 国产一区二区电影在线观看 | 蜜臀av一级做a爰片久久| 午夜久久久久久久久久一区二区| 99在线精品观看| 欧美69视频| 久久亚洲风情| 久久久www成人免费无遮挡大片| 亚洲自拍三区| 亚洲一区中文| 亚洲无限av看| 亚洲性夜色噜噜噜7777| 一区二区三区高清在线观看| 日韩视频在线一区二区三区| 亚洲高清资源| 亚洲激情电影在线| 亚洲精品国产精品乱码不99按摩| 尤物99国产成人精品视频| 精品999在线观看| 激情成人av在线| 国产亚洲成人一区| 国产一区欧美| 在线播放国产一区中文字幕剧情欧美| 国产情人节一区| 国语对白精品一区二区| 激情五月***国产精品| 一区二区在线观看视频| 一区二区三区在线免费视频| 亚洲第一精品夜夜躁人人爽| 在线看一区二区| 亚洲精品在线一区二区| 一区二区三区四区五区精品视频| 一级日韩一区在线观看| 亚洲欧美日韩国产成人精品影院| 亚洲欧美美女| 久久精品国产精品亚洲| 看片网站欧美日韩| 亚洲黄色性网站| av不卡免费看| 久久av一区二区| 免费亚洲网站| 国产精品久久激情| 国产午夜久久久久| 亚洲国产日韩欧美一区二区三区| 日韩视频精品| 久久国产精品色婷婷| 欧美大秀在线观看| 亚洲深夜福利| 久久免费99精品久久久久久| 欧美精品一区二区久久婷婷| 国产精品一区二区在线| 亚洲观看高清完整版在线观看| 99视频一区二区| 久久久久久久999精品视频| 亚洲国产成人tv| 性伦欧美刺激片在线观看| 免费在线亚洲欧美| 国产欧美一级| 日韩一二三区视频| 久久久亚洲精品一区二区三区 | 老牛影视一区二区三区| 日韩亚洲欧美精品| 久久久久久久久久久一区 | 欧美成人一区二区| 国产精品久久久久久一区二区三区 | 亚洲毛片视频| 久久精品亚洲精品国产欧美kt∨| 欧美日韩一区二区三区高清| 原创国产精品91| 欧美亚洲视频在线看网址| 亚洲国产美国国产综合一区二区| 性欧美暴力猛交69hd|