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

Note of Justin

關于工作和讀書的筆記

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

留言簿(14)

搜索

  •  

積分與排名

  • 積分 - 53598
  • 排名 - 433

最新評論

閱讀排行榜

評論排行榜

[原創文章歡迎轉載,但請保留作者信息]
Justin 于 2009-12-28

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

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

首先大師先是給出最經典當然也是最簡單的swap函數實現:用了一個中間臨時對象,然后兩兩交換。這也是std::swap的缺省實現,如果這樣的swap已經可以滿足需要,那么就不需要再費心考慮,直接用就是了。我們就提前下課。

如果還在讀,說明可能意識到:缺省的方法很簡單,而在一些情況下卻也很耗資源:比如需要交換的是一個很復雜龐大的對象時,創建/拷貝大量數據會使得這種swap的效率顯得非常低下。

于是,大師給出更加適應的實現思路:

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

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

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

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


參考文章:
Why Not Specialize Function Templates?
Template Specialization and Partial Template Specialization
posted on 2010-01-16 10:37 Justin.H 閱讀(2137) 評論(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>
            国产精品老女人精品视频| 国产欧美日韩视频一区二区三区| 韩国av一区二区三区| 久久久噜噜噜久噜久久| 久久国产精品电影| 亚洲国产电影| 亚洲第一中文字幕| 欧美电影电视剧在线观看| 日韩视频中文| 亚洲午夜久久久久久久久电影网| 国产亚洲欧美一区| 免费一级欧美在线大片| 欧美18av| 欧美一区二区性| 久久亚洲精品欧美| 日韩一区二区福利| 午夜精品久久久久99热蜜桃导演| 韩国av一区二区三区在线观看| 欧美激情成人在线| 国产精品成人一区二区三区夜夜夜| 欧美亚洲系列| 欧美成人精品一区二区三区| 亚洲天堂av在线免费| 久久精品国产一区二区三区| 日韩一级视频免费观看在线| 欧美一级久久久久久久大片| 亚洲激情电影在线| 亚洲天堂av图片| 亚洲国产精品电影| 亚洲在线网站| 亚洲精品日本| 久久精品国产成人| 亚洲一本大道在线| 久久综合色天天久久综合图片| 中文日韩在线视频| 老司机一区二区三区| 午夜精品亚洲| 欧美激情成人在线| 久久天天躁狠狠躁夜夜av| 欧美天堂在线观看| 欧美高清不卡| 激情综合视频| 亚洲欧美综合精品久久成人 | 亚洲校园激情| 亚洲美女在线观看| 久久久久国内| 久久夜色精品国产欧美乱| 欧美色偷偷大香| 亚洲欧洲视频在线| 亚洲国产福利在线| 久久精品99久久香蕉国产色戒 | 国产伦理一区| 宅男噜噜噜66一区二区| 亚洲伦理在线观看| 美日韩精品视频| 欧美不卡一卡二卡免费版| 激情五月综合色婷婷一区二区| 亚洲无毛电影| 亚洲女ⅴideoshd黑人| 欧美日韩一区三区| 亚洲另类在线视频| 一区二区三区国产盗摄| 欧美激情免费观看| 亚洲国产精品美女| 亚洲美女诱惑| 欧美日韩影院| 亚洲图片欧洲图片日韩av| 亚洲综合色激情五月| 国产精品男gay被猛男狂揉视频| 99在线精品观看| 亚洲欧美日韩一区二区| 国产精品激情电影| 亚洲欧美国产精品专区久久| 欧美亚洲三级| 一色屋精品视频在线看| 久久综合久色欧美综合狠狠| 免费不卡视频| 一区二区黄色| 国产精品亚洲一区二区三区在线| 亚洲午夜一二三区视频| 久久国产精品99国产| 国产一区二区三区高清在线观看| 久久高清免费观看| 亚洲韩国一区二区三区| 亚洲天堂av在线免费| 国产区精品视频| 毛片精品免费在线观看| 亚洲人www| 欧美有码在线视频| 一色屋精品亚洲香蕉网站| 欧美国产成人精品| 亚洲免费人成在线视频观看| 久久在线视频在线| 日韩视频一区| 国产模特精品视频久久久久| 久久成人综合视频| 亚洲久久在线| 久久蜜桃av一区精品变态类天堂| 亚洲欧洲一区| 国产精品一区二区a| 麻豆国产精品一区二区三区| 99视频国产精品免费观看| 久久精品亚洲国产奇米99| 亚洲精品视频在线| 国产欧美日韩不卡免费| 欧美不卡视频一区发布| 亚洲一区二区精品| 亚洲国产精品久久人人爱蜜臀 | 欧美日韩国产综合视频在线观看中文 | 亚洲免费激情| 久久亚洲电影| 亚洲欧美精品在线| 亚洲激情成人网| 国产欧美日韩在线视频| 欧美精品一区二| 欧美在线中文字幕| 一本色道久久综合狠狠躁篇怎么玩 | 国产亚洲a∨片在线观看| 欧美精品观看| 久久婷婷久久一区二区三区| 亚洲视频网站在线观看| 欧美电影免费网站| 久久国产精品一区二区三区| 一区二区精品| 亚洲伦理中文字幕| 伊大人香蕉综合8在线视| 国产精品一二三四| 欧美日韩亚洲一区二区三区在线观看 | 在线亚洲免费视频| 亚洲国产精品一区二区三区| 久久久久女教师免费一区| 亚洲性视频网址| 99国产精品久久久久久久成人热| 影音先锋久久精品| 国产一区二区成人久久免费影院| 欧美午夜精品久久久久免费视| 免费亚洲一区二区| 久久久久久夜| 欧美一区二区三区在线视频| 在线一区二区视频| 一区二区三区精品视频| 日韩视频在线观看免费| 亚洲人在线视频| 亚洲黄色性网站| 91久久精品美女| 亚洲精品久久久久久下一站 | 久久亚洲国产成人| 久久久久综合一区二区三区| 欧美一区免费视频| 欧美一区二区在线播放| 欧美中文字幕久久| 欧美在线观看一区| 久久精品五月| 母乳一区在线观看| 欧美华人在线视频| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美成人一二三| 亚洲激情视频在线| 一本色道婷婷久久欧美| 亚洲一卡久久| 久久成人综合网| 免费成人网www| 欧美日韩大片| 国产精品推荐精品| 国语自产精品视频在线看一大j8| 黑丝一区二区| 亚洲精品色图| 欧美一区二区三区男人的天堂| 久久精品国产亚洲高清剧情介绍| 麻豆国产精品va在线观看不卡| 牛牛影视久久网| 日韩一区二区久久| 欧美一区二区三区男人的天堂| 久久精品国产99国产精品澳门| 欧美成年人视频| 国产精品久久九九| 在线日韩欧美视频| 亚洲一级高清| 美女诱惑一区| 亚洲欧美成人一区二区在线电影| 久久九九99视频| 欧美日韩中文在线观看| 好男人免费精品视频| 一区二区三区高清不卡| 久久精品综合| 夜夜躁日日躁狠狠久久88av| 久久久91精品国产一区二区三区 | 欧美日韩综合| 一区二区三区在线免费观看| 亚洲视频在线观看| 久久天天躁夜夜躁狠狠躁2022 | 日韩视频在线永久播放| 久久精品二区三区| 欧美性淫爽ww久久久久无| 在线观看亚洲a| 亚洲女人天堂成人av在线| 亚洲国产精品一区二区www在线 | 亚洲狠狠婷婷| 久久精品论坛| 国产欧美综合一区二区三区|