考慮寫出乙個不丟擲異常的swap函式

2021-06-04 12:56:30 字數 1349 閱讀 3666

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...