1、當std::swap對你的型別效率不高時,提供乙個swap成員函式,並確定這個函式不丟擲異常。
2、如果你提供乙個member swap函式,也該提供乙個non-member swap函式,後者用來呼叫前者。對於class(而非template),也請特化std::swap
3、呼叫swap時應針對std::swap使用using宣告式,然後呼叫swap並且不帶任何「命名空間資格修飾」。
4、為「使用者定義型別」進行std template全特化是好的,但千萬不要嘗試在std內加入某些對std而言全新的東西。
如swap的預設實現對你的class或者class template提供可接受的效率,你不需要額外做任何事情,任何嘗試置換(swap)那種物件的人都會取得預設版本,而那將有良好的運作。
其次,如果swap預設實現版本的效率不足(那幾乎總是以為你的class或者class template使用了某種pimpl【pointer 頭implement】手法),嘗試做以下 的事情:
1、提供乙個public swap成員函式,讓他高效的置換(swap)你的型別的兩個物件值。
2、在你的class或者是template所在的命名空間內提供乙個non-member swap函式,並令他呼叫上述swap函式(member swap函式)。
3、如果你正在編寫乙個class(而不是class template),為你的class特化std::swap。並令他呼叫你的swap成員函式。
最後,如果你呼叫swap函式,請確定包含乙個using宣告式,以便讓std::swap在你的函式內**可見,然後不加任何namespace修飾符,赤裸裸的呼叫swap。
namespace std
只要型別t支援copying(通過copy建構函式和copy assignment操作符完成)。
class aimpl
private:
aimpl *pimpl;
一旦要置換兩個a物件,使用std::swap賦值的不僅僅是*pimpl物件,還有很多其他的物件,浪費。。。
特化版本:
namespace std
」template<>「表示他是std::swap的乙個全特化的版本。
class a
namespace std
template
class aimpl;
template
class a
解決辦法:
namespace astuff;
template
void swap(a&a,a&b)
template
void dosomething(t &a,t&b)
using std::swap;
swap(a,b);
考慮寫出乙個不丟擲異常的swap函式
swap是stl中的標準函式,用於交換兩個物件的數值。後來swap成為異常安全程式設計 exception safe programming,條款29 的脊柱,也是實現自我賦值 條款11 的乙個常見機制。swap的實現如下 namespace std 只要t支援copying函式 copy建構函式和...
條款25 考慮寫出乙個不丟擲異常的swap函式
swap原本只是stl的一部分,後面成為異常安全程式設計的脊柱,及處理自我賦值安全性的乙個常見機制。例子 標準程式庫提供的swap演算法 namespace s td 要求 型別t支援copying 通過copying建構函式和copyassignment操作符完成 上述 主要涉及三個物件的複製,但...
條款25 考慮寫出乙個不丟擲異常的swap函式
首先本篇部落格的主要思想是 系統自帶的swap函式有時候不能滿足我們的需求,所以在一些情況下我們就需要自己去寫swap函式。此條款的主要內容就是告訴你該如何去寫你要的swap函式,下面開始正文來好好地介紹一下此條款的內容 1.首先來看一下庫裡面給的swap函式的原型 可以看出來標準程式庫提供的swa...