25考慮寫出一個不拋出異常的swap函數——effective c++學習筆記

來源:互聯網
上載者:User

std::swap是一個模板,他提供的是置換操作,即將同一類型對象a,b互換內部值。swap操作要求對象支援copying建構函式和copying賦值函數,在內部操作上,他使用了三個賦值對象。

這裡有一個問題,就是對於特定的對象,它的效率會非常的低。所以我們要針對特定的對象進行特殊的swap。

總結:

1、 
如果swap的預設實現碼對你的class或者class template提供可以接受的效率,你不需要額外做任何事情,。

2、 
如果swap預設實現版的效率不足,試著做下面的事情

(1)    
提供一個public swap函數,讓他高效的置換你的類型的兩個對象,這個函數不可以拋出異常。這一限制僅限於成員版swap。

(2)    
在你的class或template所在的命名空間內,提供一個non-member swap,並令他調用swap成員函數。

(3)    
如果你正在編寫一個class或template,為你的class特化std::swap,並令他們調用你的swap函數。

3、 
如果你調用swap,請確保包含一個using聲明式,以便讓std::swap在你的函數內曝光可見,然後不叫任何namespace修飾符,赤裸裸的調用swap。

 

注意:

1、 
當std::swap效率不高時,提供一個swap成員函數,並確保這個函數不拋出異常。

2、 
如果你提供一個members swap,也應該聲明一個non-member swap來調用前者,對於classes而非template,也請特化std::swap。

3、 
如果你調用swap,請確保包含一個using聲明式,以便讓std::swap在你的函數內曝光可見,然後不叫任何namespace修飾符,赤裸裸的調用swap。

4、 
為使用者定義型別進行std template全特化是好的,但千萬不要嘗試在std內加入某些對std而言全新的東西。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.