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

Note of Justin

關(guān)于工作和讀書的筆記

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

積分與排名

  • 積分 - 53597
  • 排名 - 433

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

[原創(chuàng)文章歡迎轉(zhuǎn)載,但請(qǐng)保留作者信息]
Justin 于 2009-12-28

筆記寫到一半,有一些同學(xué)說還是不要放在首頁了他們想讀自己會(huì)去找的。想想也有道理,假借大師的名義污染大眾的視線確實(shí)還是有點(diǎn)不厚道。
所以后面的筆記會(huì)放回新手區(qū)。噢~再見了首頁~

言歸正傳,記錄大師的第25堂課。
不知道std::swap函數(shù)是不是有那么重要(原文說它是異常安全性編程 exception-safe programming的脊柱……),Scott專門用一個(gè)Item來說明實(shí)現(xiàn)它需要考慮的各種因素。讀下來我倒是覺得文中提到的方法或技巧可以用到更多的地方,swap只不過是個(gè)典型罷了。

首先大師先是給出最經(jīng)典當(dāng)然也是最簡(jiǎn)單的swap函數(shù)實(shí)現(xiàn):用了一個(gè)中間臨時(shí)對(duì)象,然后兩兩交換。這也是std::swap的缺省實(shí)現(xiàn),如果這樣的swap已經(jīng)可以滿足需要,那么就不需要再費(fèi)心考慮,直接用就是了。我們就提前下課。

如果還在讀,說明可能意識(shí)到:缺省的方法很簡(jiǎn)單,而在一些情況下卻也很耗資源:比如需要交換的是一個(gè)很復(fù)雜龐大的對(duì)象時(shí),創(chuàng)建/拷貝大量數(shù)據(jù)會(huì)使得這種swap的效率顯得非常低下。

于是,大師給出更加適應(yīng)的實(shí)現(xiàn)思路:

  1. 在類/模板類(class/class template)中定義一個(gè)公有的swap成員函數(shù),這個(gè)函數(shù)負(fù)責(zé)實(shí)現(xiàn)真正的交換操作。同時(shí),這個(gè)函數(shù)不能拋出異常。
    用成員是因?yàn)榻粨Q操作中可能會(huì)需要訪問/交換類的私有成員;用公有(public)來限制是為了給下面的輔助函數(shù)(wrapper function)提供接口。
    至于不能拋出異常,有兩個(gè)原因:
    • 一是Item29中所提到的異常安全性(exception-safety)需要不拋出異常的swap來提供保障(更多細(xì)節(jié)就到拜讀29條的時(shí)候再記錄吧。)
    • 二是一般而言高效的swap函數(shù)幾乎都是對(duì)內(nèi)置類型的交換,而對(duì)內(nèi)置類型的操作是不會(huì)拋出異常的。
  2. 如果需要使用swap的是一個(gè)類(而不是模板類),就需要為這個(gè)類全特化std::swap,然后在這個(gè)特化版本中調(diào)用第一步中實(shí)現(xiàn)的swap函數(shù)。
    class ?AClass{
    public :
    ???
    void ?swap(AClass & ?theOtherA)
    ???{
    ??????
    using ?std::swap;? // 這一句會(huì)在稍后的第3點(diǎn)提到
    ??????
    // ?通過調(diào)用swap來完成該類的特有交換動(dòng)作
    ???}
    // ..
    }

    namespace ?std{
    ???
    // 在std名字域內(nèi)定義一個(gè)全特化的swap
    ???template <> ? // 這樣的定義說明是全特化
    ??? void ?swap < AClass > ?(?AClass & ?a,?AClass & ?b)
    ???{
    ??????a.swap(b);
    ???}
    }
    如此一來,用戶可以直接應(yīng)用同樣的swap函數(shù)進(jìn)行交換操作,而當(dāng)交換對(duì)象是需要特殊對(duì)待的AClass對(duì)象時(shí),也可以無差別的使用并得到預(yù)期的交換結(jié)果。
  3. “2.”中說的是當(dāng)交換“類”時(shí)可以采取的辦法,而如果我們需要交換的是模板類,那么就不能用全特化std::swap的方法了。然而用偏特化的std::swap也行不通,因?yàn)椋?br />
    • C++中不允許對(duì)函數(shù)進(jìn)行偏特化(只能對(duì)類偏特化),也 就是說不能寫出下面的程序:
      namespace?std{???
      ???
      //?illegal?code?as?C++?doesn't?allow?partial?specialization?for?function?templates
      ???template<typename?T>
      ???
      void?swap<?AClassTemplate<T>?>(AClassTemplate<T>&?a,?AClassTemplate<T>&?b)
      ???{
      ??????a.swap(b);
      ???}
      }
    • std名字空間中的內(nèi)容都是C++標(biāo)準(zhǔn)委員會(huì)的老大們定義的,為了保證std內(nèi)部代碼的正常運(yùn)作(同時(shí)為了向老大表示尊敬……),委員會(huì)以外的小輩們是不允許往里頭添加任何新的模板、類、方程或是其他的什么東東的,重載也不可以。因此,雖然可以像2.那樣寫出全特化的模板函數(shù),但是企圖在std的名字空間添加以下重載的swap(這種重載變相實(shí)現(xiàn)了函數(shù)的偏特化)是不被C++委員會(huì)同意的(雖然你可以通過編譯,但是會(huì)埋下隱患):
      namespace?std{
      ???template?
      <typename?T>
      ???
      void?swap?(AClass<T>&?a,?AClass<T>&?b)
      ???{?a.swap(b);}
      }
      給自己的一個(gè)小提醒:因?yàn)楹瘮?shù)名swap后沒有<>,所以不是偏特化,而是對(duì)
      namespace?std{
      ???template
      <class?_Ty>?inline
      ???
      void?swap(_Ty&?_X,?_Ty&?_Y)
      ???{
      /*..*/}
      }
      的重載而已。

    基于上面兩個(gè)原因,一個(gè)變通的方法是在該模板類所在的名字空間中編寫一個(gè)非成員的函數(shù)模板來調(diào)用這個(gè)公有的接口:
    namespace?AClassSpace{
    ???template?
    <typename?T>
    ???
    void?swap?(AClass<T>&?a,?AClass<T>&?b)
    ???{?a.swap(b);}
    }
    在限定的名字空間中實(shí)現(xiàn)函數(shù),是為了避免“污染”全局的名字空間。而且,不同的名字空間都可以使用一樣的函數(shù)名字而不會(huì)有沖突。
    基于前面第23課所學(xué),使用非成員函數(shù)也是應(yīng)該的了。
    至于為什么要函數(shù)模板,那就匪常D簡(jiǎn)單:因?yàn)橐粨Q的是模板@#¥%

本課超時(shí),理解上也許還有偏差。不過,Scott老師額外講了pimpl手法作為友情贈(zèng)送:
pimpl也即pointer to implementation,第31課會(huì)繼續(xù)講解。不過說來也簡(jiǎn)單:當(dāng)需要交換兩個(gè)復(fù)雜且臃腫的對(duì)象時(shí),可以先用兩個(gè)指針分別指向著兩個(gè)對(duì)象,之后對(duì)這些對(duì)象的操作,包括交換,就只需要通過這兩個(gè)指針來進(jìn)行(交換兩個(gè)指針的值便實(shí)現(xiàn)了對(duì)象的交換)。


參考文章:
Why Not Specialize Function Templates?
Template Specialization and Partial Template Specialization
posted on 2010-01-16 10:37 Justin.H 閱讀(2137) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Effective C++ 炒冷飯
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品国产麻豆| 久久久青草青青国产亚洲免观| 午夜影院日韩| 黄色精品免费| 亚洲国产一区视频| 欧美激情视频一区二区三区在线播放| 亚洲国产精品免费| 亚洲久久成人| 国产乱码精品一区二区三区五月婷 | 在线观看精品一区| 亚洲电影在线| 国产精品毛片| 久久人人爽人人| 欧美成人免费全部观看天天性色| 亚洲免费久久| 亚洲欧美日本伦理| 亚洲人成网站在线观看播放| 99国产精品99久久久久久粉嫩| 国产精品国产三级国产专播品爱网 | 日韩视频一区二区三区在线播放 | 久久久久久久高潮| 男人的天堂成人在线| 在线亚洲免费视频| 久久av一区二区三区亚洲| 亚洲国产裸拍裸体视频在线观看乱了中文 | 最新中文字幕一区二区三区| 日韩一本二本av| 国户精品久久久久久久久久久不卡| 亚洲第一综合天堂另类专| 国产精品美女久久久浪潮软件| 欧美a级在线| 国产精品进线69影院| 欧美成人dvd在线视频| 国产精品久久久久久久久久免费看| 欧美69wwwcom| 国产日韩精品一区| 日韩亚洲视频| 亚洲精品国精品久久99热| 欧美一区二区三区久久精品茉莉花| 亚洲韩国一区二区三区| 欧美影视一区| 亚洲欧美在线网| 亚洲天堂av综合网| 一区二区亚洲精品国产| 亚洲视频日本| 99视频精品在线| 欧美sm视频| 另类欧美日韩国产在线| 国产视频丨精品|在线观看| 亚洲日本欧美| 91久久国产综合久久| 久久久www成人免费无遮挡大片 | 亚洲电影在线观看| 亚洲永久免费观看| 亚洲一区日韩在线| 欧美日韩亚洲高清一区二区| 欧美成人午夜剧场免费观看| 一区二区在线不卡| 欧美在线综合视频| 久久激情五月丁香伊人| 国产精品任我爽爆在线播放| 在线一区二区三区四区| 亚洲一区二区在线免费观看视频| 欧美激情区在线播放| 亚洲日本成人网| 99国产精品国产精品毛片| 欧美精品v日韩精品v国产精品| 欧美国产一区视频在线观看| 亚洲激情欧美| 欧美日韩另类字幕中文| 日韩视频专区| 翔田千里一区二区| 国产日本欧美在线观看| 欧美在线播放视频| 狂野欧美一区| 最新日韩在线视频| 欧美日韩一区在线观看视频| 在线亚洲欧美视频| 欧美亚洲一区在线| 禁久久精品乱码| 久久伊人亚洲| 亚洲国内精品| 亚洲自拍偷拍麻豆| 好看的日韩视频| 久热re这里精品视频在线6| 欧美福利专区| 亚洲一区二区不卡免费| 国产欧美日韩亚洲一区二区三区| 久久成人免费| 亚洲美女在线视频| 欧美永久精品| 亚洲精品一二三区| 国产精品久久久久av| 欧美在线免费看| 亚洲精品久久久蜜桃| 香港久久久电影| 最近看过的日韩成人| 国产精品久久国产精品99gif| 欧美一区二区三区在线视频| 亚洲国产精品一区在线观看不卡 | 亚洲乱码国产乱码精品精天堂 | 美女视频一区免费观看| 夜夜爽www精品| 狠狠色丁香久久综合频道 | 午夜精品影院| 亚洲国产高清自拍| 久久高清福利视频| 日韩一级大片在线| 国语自产精品视频在线看8查询8| 欧美成人国产| 亚欧美中日韩视频| 一区二区激情小说| 亚洲第一页在线| 久久精品国产综合| 亚洲小视频在线观看| 亚洲国产婷婷| 国产亚洲一二三区| 欧美三级视频| 欧美黄污视频| 久久综合给合| 久久国产视频网站| 亚洲一区精品视频| 亚洲精品久久久久久久久| 久久综合久久美利坚合众国| 亚洲男人av电影| 亚洲午夜激情在线| 在线亚洲一区二区| 亚洲精品久久久久中文字幕欢迎你 | 久久久一区二区| 欧美一区二区三区免费视频| 一区二区久久| 一本色道久久| 日韩视频免费观看高清在线视频| 欧美激情视频一区二区三区免费| 久久全国免费视频| 久久久中精品2020中文| 久久国产精品色婷婷| 欧美亚洲三级| 欧美一区二区三区免费视频| 小辣椒精品导航| 欧美一区二区三区免费视| 小黄鸭视频精品导航| 亚洲欧美日韩精品久久久久| 亚洲欧美日韩国产一区二区三区| 亚洲一品av免费观看| 亚洲一区欧美| 欧美一区2区三区4区公司二百 | 亚洲乱码国产乱码精品精可以看| 在线视频国产日韩| 亚洲人成在线观看| 99精品热视频只有精品10| 99精品欧美一区二区三区| 一区二区三区欧美在线观看| 亚洲视频在线看| 中文欧美字幕免费| 欧美亚洲免费高清在线观看| 久久国产精彩视频| 免费不卡在线视频| 亚洲国产高清自拍| 一区二区欧美视频| 欧美一区二区在线看| 久久激情视频| 欧美精品粉嫩高潮一区二区 | 国产日韩欧美高清| 在线国产亚洲欧美| 99在线精品视频| 午夜在线精品偷拍| 麻豆成人91精品二区三区| 欧美国产精品v| 在线午夜精品自拍| 欧美专区福利在线| 欧美精品在线观看| 国产欧美日韩在线观看| 亚洲国产成人久久| 午夜精品福利在线观看| 免费观看不卡av| 99在线|亚洲一区二区| 久久国产精品久久久久久| 欧美另类在线观看| 国产亚洲va综合人人澡精品| 亚洲日韩欧美一区二区在线| 午夜精品婷婷| 亚洲第一色中文字幕| 午夜精品久久久久久久蜜桃app | 亚洲国产欧美国产综合一区| 国产精品99久久久久久久久| 久久久噜噜噜久久久| 99精品热6080yy久久| 久久色在线观看| 国产精品婷婷| 一本久久青青| 欧美黄色片免费观看| 欧美一区二区视频在线观看| 欧美日韩在线观看一区二区三区| 激情久久五月| 欧美在线播放| 中日韩在线视频|