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

ACG狂人

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

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

boost::bind(&memberfunction, obj, _1, _2........)類似這樣的用法,我們叫做成員函數(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);

由上面的代碼可以看出,我們可以隨便傳任意一種類對(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),那么這種情況的話,我們只好傳遞單件對(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
<<"鍵盤響應(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 釀妹汁 閱讀(5847) 評(píng)論(4)  編輯 收藏 引用 所屬分類: 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)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一级日韩一级| 久久人人97超碰人人澡爱香蕉| 国产精品乱码久久久久久| 影院欧美亚洲| 美女免费视频一区| 久久青草久久| 日韩视频免费观看高清完整版| 在线视频亚洲一区| 亚洲视频电影图片偷拍一区| 国产精品久久久久久久免费软件 | 久久激情视频| 黄色小说综合网站| 亚洲国产清纯| 欧美承认网站| 亚洲综合欧美日韩| 欧美在线免费一级片| 伊人蜜桃色噜噜激情综合| 欧美激情一区二区在线 | 久久久人人人| 老司机精品视频一区二区三区| 欧美绝品在线观看成人午夜影视 | 欧美大片在线看| 一区二区三区日韩欧美精品| 一级成人国产| 国产亚洲一区二区三区在线观看 | 国产精品区二区三区日本| 欧美亚洲色图校园春色| 久久性色av| 亚洲影院高清在线| 久久人人精品| 亚洲欧洲av一区二区| 久久久伊人欧美| 亚洲欧美成人| 免费亚洲视频| 久久久蜜桃一区二区人| 欧美日本中文| 欧美不卡一区| 国产日韩欧美综合| 亚洲乱码精品一二三四区日韩在线| 美国成人直播| 欧美一区二区三区四区在线| 久久综合久色欧美综合狠狠| 亚洲尤物影院| 欧美激情1区2区3区| 麻豆精品一区二区av白丝在线| 久久riav二区三区| 在线综合亚洲欧美在线视频| 久久久久国产成人精品亚洲午夜| 激情综合自拍| 亚洲一区二区免费看| 日韩午夜av| 免费黄网站欧美| 另类尿喷潮videofree| 国产精品日韩欧美大师| 一区二区三区国产盗摄| 亚洲国产日韩精品| 久久久久久尹人网香蕉| 久久国产夜色精品鲁鲁99| 国产精品国产三级国产| 亚洲激情成人网| 最新日韩在线| 免费成人黄色| 亚洲电影免费观看高清完整版| 欧美精品久久99| 亚洲国产精品一区二区www在线| 嫩草伊人久久精品少妇av杨幂| 亚洲精品护士| 欧美jjzz| 亚洲人成免费| 亚洲性感激情| 国产精品久久久久久久电影| 日韩视频在线一区| 一本色道久久88亚洲综合88| 欧美精品一区二区三| 亚洲国产欧美一区| 一区二区三区久久久| 欧美日韩一区二区高清| 在线视频亚洲欧美| 久久国产精品99精品国产| 国产亚洲人成a一在线v站| 欧美在线视屏| 欧美成人四级电影| 日韩亚洲欧美精品| 欧美午夜激情视频| 亚洲欧美综合v| 久久在线视频| 日韩视频一区二区在线观看 | a4yy欧美一区二区三区| 亚洲一区二区三区视频| 国产精品扒开腿做爽爽爽软件| 久久午夜激情| 亚洲人成人一区二区在线观看| 亚洲一级二级在线| 久久久亚洲高清| 91久久久久久久久| 欧美视频在线观看视频极品| 亚洲视频图片小说| 久久伊人免费视频| 一本色道久久综合| 国产免费成人在线视频| 久久久精品午夜少妇| 亚洲精品日产精品乱码不卡| 篠田优中文在线播放第一区| 亚洲第一精品在线| 欧美视频日韩视频| 久久久免费精品| 一区二区91| 欧美国产国产综合| 午夜亚洲激情| 亚洲美女色禁图| 国产亚洲一区二区在线观看| 欧美精品在线观看播放| 欧美在线高清视频| 一区二区激情小说| 欧美高清在线| 久久精品一区二区三区四区| 一本大道久久a久久精品综合| 欧美国产日韩一区二区在线观看| 裸体素人女欧美日韩| 亚洲一区尤物| 亚洲美女中出| 亚洲国产成人精品女人久久久| 久久久久久久综合日本| 洋洋av久久久久久久一区| 老司机一区二区三区| 欧美一区二区三区在线| 99这里只有精品| 亚洲韩国日本中文字幕| 国产亚洲精品美女| 国产精品日日摸夜夜摸av| 欧美另类专区| 欧美国产免费| 欧美h视频在线| 免费观看成人网| 久久色在线播放| 久久激情一区| 久久爱www久久做| 欧美一区二区三区另类 | 亚洲一级二级| av成人动漫| 日韩午夜在线| 一本大道av伊人久久综合| 亚洲日本中文字幕| 亚洲第一二三四五区| 亚洲第一偷拍| 在线观看精品一区| 亚洲成色www久久网站| 影音先锋中文字幕一区| 国产一区二区你懂的| 国产一区91| 黄色成人在线| 亚洲第一精品影视| 亚洲人成毛片在线播放| 亚洲免费播放| 亚洲在线一区二区| 亚洲欧美中文日韩在线| 欧美在线网址| 久久嫩草精品久久久精品| 蜜桃av一区二区| 欧美激情第8页| 亚洲精品乱码久久久久久黑人 | 在线成人www免费观看视频| 国内成+人亚洲+欧美+综合在线| 久久蜜桃精品| 久久综合久久久| 欧美护士18xxxxhd| 欧美日韩成人激情| 国产精品一二三视频| 国产综合久久久久久鬼色| 在线观看不卡av| 日韩香蕉视频| 欧美一区二区视频在线观看2020 | 国产又爽又黄的激情精品视频| 免费日韩av| 欧美日韩在线三级| 国产欧美日韩视频在线观看| 在线免费日韩片| 一区二区免费在线观看| 欧美一区二区三区成人| 久久亚洲二区| 亚洲乱码一区二区| 久久av一区二区三区| 欧美激情一二区| 国产主播一区二区三区四区| 亚洲精品免费看| 久久精品国产清高在天天线| 亚洲国产99| 欧美一区二区三区在线视频| 欧美激情精品久久久久久变态| 久热国产精品视频| 欧美色图首页| 亚洲国产精品悠悠久久琪琪| 一区二区精品| 欧美www视频在线观看| 亚洲一品av免费观看| 欧美国产日产韩国视频| 国内精品久久久久久| 亚洲男女自偷自拍| 亚洲电影观看| 久久久伊人欧美|