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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
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>
            葵司免费一区二区三区四区五区| 久久视频在线免费观看| 欧美性猛交99久久久久99按摩| 欧美电影打屁股sp| 欧美日韩综合| 欧美视频在线一区二区三区| 欧美日韩一区二区三区四区五区| 国产精品久久久久久久久久尿| 国产嫩草一区二区三区在线观看| 国产一区二区三区免费观看| 亚洲国产精品成人综合色在线婷婷| 亚洲精品久久在线| 亚洲欧美日韩国产一区| 久久蜜桃香蕉精品一区二区三区| 免费亚洲网站| 一本综合精品| 久久久av水蜜桃| 欧美日韩精品久久| 国产一区二区久久| 久久在精品线影院精品国产| 久久在线免费观看视频| 欧美日韩国产一区精品一区| 国产视频一区在线观看| 日韩视频在线观看| 久久久久久久久久久久久女国产乱| 欧美高清视频在线| 一区二区三区久久网| 久久免费精品日本久久中文字幕| 欧美视频在线观看一区| 亚洲电影免费在线观看| 亚洲欧美激情在线视频| 你懂的视频欧美| 亚洲欧美电影在线观看| 欧美精品一区二区在线观看 | 欧美乱人伦中文字幕在线| 国产精品影音先锋| 一本久道综合久久精品| 免费不卡中文字幕视频| 亚洲欧美一区二区三区极速播放| 欧美激情一区二区| 伊人成人在线| 久久久国产精品亚洲一区| 99ri日韩精品视频| 欧美精品日韩三级| 亚洲激情自拍| 欧美freesex交免费视频| 午夜在线电影亚洲一区| 国产精品呻吟| 亚洲欧美国产高清| 日韩视频国产视频| 欧美精选午夜久久久乱码6080| 狠狠色狠狠色综合系列| 久久激五月天综合精品| 亚洲欧美日本日韩| 国产精品永久| 久久精品国产99| 欧美一区2区三区4区公司二百| 国产精品一区二区久久| 性做久久久久久免费观看欧美| 亚洲最新中文字幕| 国产精品久久久久久久午夜片| 亚洲午夜一二三区视频| 国产精品99久久久久久久久| 欧美性大战xxxxx久久久| 亚洲欧美文学| 亚洲欧美久久久久一区二区三区| 国产精品久久久久久久久久尿| 午夜精品久久久久久久久| 亚洲欧美日韩系列| 韩国三级电影久久久久久| 玖玖精品视频| 欧美v亚洲v综合ⅴ国产v| 亚洲精选在线| 中文日韩在线| 国产一区二区三区精品欧美日韩一区二区三区 | 久热综合在线亚洲精品| 国内精品一区二区| 女生裸体视频一区二区三区| 老司机一区二区| 夜夜夜精品看看| 亚洲在线播放电影| 雨宫琴音一区二区在线| 亚洲激情视频| 欧美理论电影网| 午夜久久电影网| 久久精品国产久精国产一老狼| 亚洲成人资源网| 99国产精品视频免费观看| 国产农村妇女精品| 亚洲第一精品福利| 国产精品手机视频| 欧美国产一区二区在线观看| 欧美三级特黄| 欧美成人在线影院| 国产精品久久久久9999吃药| 麻豆成人在线| 国产精品亚洲综合| 亚洲激情成人网| 国产一区亚洲一区| 日韩网站在线观看| 一区久久精品| 亚洲永久免费| 9色porny自拍视频一区二区| 欧美在线精品一区| 亚洲图片欧美午夜| 免费看成人av| 久久精品毛片| 国产精品国产福利国产秒拍 | 欧美高清在线精品一区| 国产美女精品视频| 亚洲美女网站| 亚洲欧洲综合| 久久久夜精品| 久久免费视频在线观看| 国产精品免费看| 99精品久久久| 日韩西西人体444www| 久久躁日日躁aaaaxxxx| 久久精品亚洲一区| 国产精品视频网| 一区二区三区日韩| 夜夜爽www精品| 欧美激情一区二区三区在线视频观看 | 亚洲视频国产视频| 欧美精品入口| 亚洲激情午夜| 亚洲免费观看高清完整版在线观看熊| 久久高清国产| 噜噜噜91成人网| 黄色成人av在线| 欧美一区二区精品久久911| 午夜国产精品影院在线观看| 欧美日韩综合视频网址| 性久久久久久久| 欧美日韩精品欧美日韩精品一| 亚洲第一精品在线| 亚洲三级免费| 欧美巨乳波霸| 亚洲美女啪啪| 亚洲伊人网站| 国产裸体写真av一区二区| 亚洲欧美日韩国产精品| 欧美一区二区三区视频在线| 国产欧美一区二区色老头| 亚洲女女女同性video| 欧美一区二区精品久久911| 国产精品一区二区三区久久久| 午夜精品福利在线| 久久久久久久久久久久久女国产乱 | 免费日韩成人| 亚洲国产日韩欧美在线99| 欧美成人黄色小视频| 亚洲伦理久久| 欧美制服丝袜| 亚洲激情网址| 欧美香蕉视频| 久久九九99视频| 亚洲精品极品| 欧美一区二区精品在线| 国产日韩在线一区| 欧美电影免费网站| 亚洲专区一二三| 男同欧美伦乱| 亚洲午夜高清视频| 国产亚洲成av人片在线观看桃 | 亚洲视频精品在线| 另类av一区二区| 亚洲视频观看| 很黄很黄激情成人| 欧美精品在线一区| 久久av最新网址| 亚洲乱码久久| 美女国产一区| 午夜精品久久久久久久久久久久久| 激情欧美一区二区| 欧美午夜理伦三级在线观看| 久久久精品日韩欧美| av不卡在线观看| 欧美成人午夜剧场免费观看| 亚洲男人的天堂在线| 亚洲国产精品久久| 国产一区成人| 国产精品成人aaaaa网站| 久久一区二区三区四区| 亚洲一区在线观看免费观看电影高清| 欧美成人日韩| 久久青草久久| 亚洲欧美日韩爽爽影院| 亚洲美女淫视频| 在线看片成人| 国产日韩欧美综合在线| 欧美性大战久久久久久久| 欧美jizz19性欧美| 久久久久久高潮国产精品视| 亚洲中午字幕| 亚洲一区久久久| 亚洲视频综合在线| av不卡在线看| 亚洲免费电影在线观看| 亚洲美女网站|