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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

泛化仿函數用法及參數綁定的問題

from:http://blog.csdn.net/dog_in_yellow/archive/2007/02/15/1510538.aspx


     《C++設計新思維》一書里的泛化仿函數從Command模式講起。Command模式主要用來降低系統中命令的調用者和執行者間的依存性。設計模式的書里面一般都采用多態的機制,調用者持有Command對象的基類接口,在此處我們稱為Command接口,Command接口不知道自己將被用于執行什么命令,一般只包含一個觸發命令執行的虛函數,假設名為Excute。各種不同的實際執行命令的Command對象從則Command接口派生,并重寫Excute虛函數。這樣調用者通過Command接口來觸發命令執行時,因為虛函數機制的關系,實際上調用的都是從Command接口派生的Command對象的Excute函數。在這樣的設計中,調用者和各種實際的命令對象互不相見,只持有一個Command接口。在C風格的設計中,一般用回調預先保存的函數指針來實現Command模式。

    泛化仿函數可以說是一種回調,但它不但可以保存函數指針,還可以處理實現了operator()的C++對象,C++對象的成員函數。具體實現方法書里面已描述得非常詳細,就不再多啰嗦,在此主要說一下項目中運用泛化仿函數的一些心得。基本如下用法:
Functor<RETURN_TYPE,PARAM_TYPE_LIST> cmd1(...);
Functor有兩個泛型參數,第一個為函數返回值,第二個為函數的參數列表。構造函數可接受仿函數、類成員函數以及一般函數指針。下面示例代碼演示了其用法: 

#include "loki/functor.h"
#include 
<iostream>
#include 
<string>
using namespace std;
using namespace Loki;

struct TestFunctor
{
    
int operator()(string str)
    
{
        cout 
<< str << endl;
        
return 0;
    }

}
;

struct TestFunctor2
{
    
int output(int i)
    
{
        cout 
<< i << endl;
        
return 2;
    }

}
;

void TestFunction(int i,int j)
{
    cout 
<< i << "," << j << endl;
}


Functor
<int,NullType> BindCmd1()
{
    TestFunctor f;

    Functor
<int,LOKI_TYPELIST_1(string> cmd1( f );
    Functor
<int,NullType> bcmd1 = BindFirst( cmd1, "another bind cmd1" );

    
return bcmd1;
}


int _tmain(int argc, _TCHAR* argv[])
{
    
//泛化仿函數基本用法
    
//Functor<RETURN_TYPE, PARAM_TYPELIST> cmd(...);

    TestFunctor f;
    TestFunctor2 f2;

    
//調用operator()仿函數----------------------------
    Functor<int,LOKI_TYPELIST_1(string> cmd1( f );
    cmd1( 
"1" );
    
//end of 調用operator()仿函數----------------------


    
//調用類成員函數----------------------------------
    Functor<int,LOKI_TYPELIST_1(int> cmd2( &f2,  &TestFunctor2::output );
    cmd2( 
2 );
    
//end of調用類成員函數------------------------------


    
//調用一般函數指針---------------------------------
    Functor<void,LOKI_TYPELIST_2(int,int> cmd3( TestFunction );
    cmd3( 
3,4 );
    
//end of調用一般函數指針---------------------------

    
//預先綁定命令的參數的調用1
    Functor<int,NullType> bcmd1 = BindFirst( cmd1, "bind cmd1" );
    bcmd1();
    
//end of 預先綁定命令的參數的調用1

    
//預先綁定命令的參數的調用2
    Functor<int,NullType> bcmd1_1 = BindCmd1();
    bcmd1_1();
    
//end of 預先綁定命令的參數的調用2


    
return 0;
}

    用法很簡單,上面的幾個用法都只有兩行,第一行定義泛化仿函數,第二行執行仿函數。實際運用中定義和執行一般都各在不同的地方,如Command模式一樣,即它們在時間和空間上是分離的。

    如果您使用了LOKI0.1.5的庫,在“預先綁定命令的參數的調用2”的用法中會出現運行時錯誤,這是我在項目過程中碰到的,經過分析LOKI中Functor實現的代碼,終于找到了原因。項目中實際的運用當然不是這樣,示例代碼只說明了在什么情況下運用才會出錯。如代碼所示,調用綁定了參數的仿函數時,如果已經離開了所綁定參數的作用域則會出錯。而其罪魁禍首在于對綁定的參數作了優化。

  《C++設計新思維》P123中講到為避免函數轉發的成本對函數參數作了優化,如果參數為非基本類型(非內置類型,如自定義的struct,class),則將參數類型更改為該參數的引用類型。如示例中的int operator()(string str)被優化后str參數變成string &str。而當一個引用已離開其所引用對象的作用域后,該引用會成為一個dead reference,使用了dead reference,不可避免地結局就是運行時錯誤。或許作者不許我們這么使用綁定參數,或者作者沒想到我們會這么使用綁定,但至少說明了一點,過多地優化未必是件好事。

    既然知道了為什么會出錯,那就容易解決問題了。綁定的原理是將參數保存起來,在調用的時候取出預先保存的參數傳遞給要調用的函數。如果保存的類型是值類型,那不管是否離開原參數的作用域都不會出錯。現在我們來找實現參數綁定的類定義。在Functor.h中找到class BinderFirst,該類中有一個 類型定義如下:
typedef typename Private::BinderFirstBoundTypeStorage<
 typename Private::BinderFirstTraits<OriginalFunctor>
 ::OriginalParm1>::RefOrValue
 BoundTypeStorage;
BoundTypeStorage即保存所綁定參數的類型定義,觀其定義可以知道該類型也是做了優化,非基本類型都變成了引用。現在我們來做一點小改動,使用參數原來的類型來保存參數,修改后的定義如下:
typedef typename Private::BinderFirstTraits<OriginalFunctor>
   ::OriginalParm1
   BoundTypeStorage;
修改完畢后,重新編譯運行,一切OK了。

    其實上述改動并不能解決所有問題,這種做法是使用參數的原始類型來保存參數,假如參數本身是個引用類型,那在離開了所引用對象的作用域時調用還是會出錯的。最徹底的改法是將引用參數去掉引用作為保存參數的類型。我的做法是在使用的時候做文章,不管參數是否引用類型,定義綁定的Functor時都定義成非引用類型,這樣再配合上面的改動,參數必然會使用值類型保存。如果明確地知道調用時不會離開原參數的作用域,那就不必如此了。只要心中有個底,具體用法就視個人運用的環境以及個人做法的喜好了。

LOKI0.1.5下載地址:http://sourceforge.net/forum/forum.php?forum_id=583500

posted on 2007-09-03 16:02 楊粼波 閱讀(506) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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| 久久中文精品| 欧美精品在线免费观看| 欧美日韩在线视频一区| 国产精品都在这里| 国产亚洲精品bt天堂精选| 在线观看成人av电影| 亚洲精品资源美女情侣酒店| 亚洲视频在线一区| 久久九九热免费视频| 亚洲国产精品久久久久久女王| 免费久久99精品国产自| 亚洲精品小视频| 亚洲视频欧美在线| 老司机免费视频一区二区三区| 欧美精品一区二区视频| 国产亚洲综合性久久久影院| 91久久久久久久久| 香蕉久久夜色精品| 91久久精品久久国产性色也91| 亚洲欧美激情在线视频| 欧美超级免费视 在线| 国产精品卡一卡二卡三| 1024亚洲| 午夜在线一区二区| 欧美高清自拍一区| 亚洲自拍高清| 欧美日韩日本国产亚洲在线 | 一区二区三区日韩| 久久精品视频网| 欧美日韩在线观看一区二区三区| 国产亚洲精品美女| 亚洲永久字幕| 亚洲国产午夜| 久久久久久久久久码影片| 国产精品大片免费观看| 91久久极品少妇xxxxⅹ软件| 欧美一区三区二区在线观看| 亚洲精品综合在线| 免费毛片一区二区三区久久久| 国产精品盗摄久久久| 日韩一级片网址| 欧美成人精品一区二区| 欧美亚洲一区在线| 国产欧美精品在线观看| 午夜激情综合网| 日韩亚洲一区二区| 久热精品视频| 亚洲欧美日韩天堂| 国产精品高潮粉嫩av| 亚洲一本视频| 亚洲免费电影在线| 欧美日韩国产在线| 中文在线资源观看视频网站免费不卡| 欧美成人一区二区三区片免费| 性色av香蕉一区二区| 国产一区二区毛片| 久久亚洲春色中文字幕| 亚欧成人在线| 狠狠v欧美v日韩v亚洲ⅴ| 久久久久久久91| 欧美一区二区三区男人的天堂| 国产精品毛片在线看| 欧美伊人久久久久久午夜久久久久| 日韩午夜精品视频| 欧美性色视频在线| 午夜在线视频观看日韩17c| 亚洲自拍偷拍一区| 国产一区自拍视频| 另类综合日韩欧美亚洲| 老色鬼精品视频在线观看播放| 亚洲国产精品一区二区尤物区| 亚洲私人影吧| 亚洲深夜影院| 国产亚洲欧美色| 欧美激情精品久久久久久黑人| 欧美国产免费| 先锋影音一区二区三区| 欧美亚洲日本网站| 亚洲国产精品电影| 91久久精品一区| 国产精品av免费在线观看| 欧美一区二区在线免费播放| 久久精品中文字幕一区二区三区| 在线观看亚洲视频| 亚洲激情自拍| 国产精品亚洲成人| 美女国产精品| 欧美三级免费| 欧美va天堂| 中国亚洲黄色| 欧美在线免费视屏| 亚洲视频精选| 久久天天躁夜夜躁狠狠躁2022| 洋洋av久久久久久久一区| 亚洲在线免费观看| 亚洲人精品午夜| 亚洲欧美美女| 日韩亚洲不卡在线| 久久国产精品第一页| 亚洲神马久久| 麻豆久久婷婷| 久久九九久精品国产免费直播| 欧美另类一区二区三区| 久久久久久亚洲精品不卡4k岛国| 久久综合九色| 久久激情视频久久| 国产精品久久久久久久久久免费| 男女av一区三区二区色多| 久久av一区二区三区| 亚洲一区二区动漫| 久久久青草青青国产亚洲免观| 久久影院午夜论| 久久精彩免费视频| 国产精品久久久久久久浪潮网站| 亚洲国产毛片完整版 | 欧美在线免费观看视频| 欧美成人tv| 女仆av观看一区| 国产综合精品| 亚洲欧美日韩综合| 新片速递亚洲合集欧美合集| 欧美精品在线免费播放| 亚洲黄色av一区| 亚洲精品久久久久| 欧美顶级艳妇交换群宴| 亚洲国产欧美不卡在线观看| 亚洲大胆人体视频| 可以看av的网站久久看| 欧美成人性网| 亚洲国产精品高清久久久| 另类酷文…触手系列精品集v1小说| 性色av一区二区三区| 国产精品美女主播在线观看纯欲| 一区二区精品在线观看| 午夜精品久久久久影视| 国产精品―色哟哟| 午夜精品视频在线观看| 久久频这里精品99香蕉| 影音先锋久久精品| 久久婷婷久久| 欧美黄色aaaa| 亚洲深爱激情| 国产精品三级久久久久久电影| 亚洲欧美日韩第一区| 久久久久久久国产| 1000部国产精品成人观看| 美女久久一区| 亚洲精品欧洲| 亚洲一级高清| 国产视频亚洲精品| 久久美女性网| 亚洲精品在线看| 欧美一区二区在线| 亚洲国产你懂的| 欧美三级午夜理伦三级中文幕| 中国成人亚色综合网站| 欧美中文字幕精品| 亚洲国产精品999| 欧美视频日韩| 欧美亚洲综合另类| 亚洲日韩视频| 欧美在线看片| 亚洲国产精品va| 欧美三日本三级三级在线播放| 午夜精品视频在线观看| 欧美黄色一区| 欧美一区二区三区免费观看视频| 韩日视频一区| 欧美日韩亚洲一区二区三区四区 | 久久se精品一区精品二区| 在线观看视频一区二区| 亚洲深夜福利网站| 亚洲大胆人体在线| 国产精品久久久久久久app| 欧美专区在线观看| 妖精视频成人观看www| 欧美wwwwww| 欧美在线视频一区二区三区| 最新国产成人在线观看| 国产嫩草一区二区三区在线观看| 麻豆国产va免费精品高清在线| 亚洲专区免费| 亚洲精品一区二区三区樱花| 久久亚洲捆绑美女| 欧美一区二区三区久久精品| 一区二区成人精品| 91久久亚洲| 亚洲电影成人| 国内一区二区在线视频观看| 国产精品乱码一区二三区小蝌蚪| 欧美精品二区| 欧美电影免费观看高清| 久久免费精品视频| 久久爱另类一区二区小说|