2012-03-13 56 views
3

基於pp. 8使用boost :: swap交換原始指針?

免費功能

template<typename T> void swap(scoped_ptr<T>& a,scoped_ptr<T>& b) 

此功能提供了通過交換兩個範圍的指針 內容的首選方式。這是可取的,因爲 交換(scoped1,scoped2)可以通用(在模板化代碼中) 許多指針類型,包括原始指針和第三方智能指針[2]。 scoped1.swap(scoped2)僅適用於智能指針,不適用於裸指針上的 ,僅適用於定義操作的指針。

int* pA = new int(10); 
int *pB = new int(20); 

boost::swap(pA, pB); // Error: could not deduce template argument for 'boost::scoped_ptr<T> &' from 'int *' 

問題>如何交換原始指針與boost::swap

+0

是你的書或代碼片段? – GManNickG 2012-03-13 19:21:32

回答

4

我不明白爲什麼其他答案告訴你不要使用boost::swap整個目的boost::swap是爲了隱藏using std::swap; swap(x, y);業務。這只是正常:

#include <boost/swap.hpp> 

int main() 
{ 
    int* pA = new int(10); 
    int *pB = new int(20); 

    boost::swap(pA, pB); 

    delete pA; 
    delete pB; 
} 

顯然,如果您還沒有boost/swap.hpp這將無法工作。這就是你用boost::swap交換兩件事情的方法。你應該總喜歡用這種形式交換兩件事!

什麼你正在閱讀僅僅是指出boost::scoped_ptr還提供了boost命名空間中的swap過載,使這個工程太:

#include <boost/scoped_ptr.hpp> 

int main() 
{  
    boost::scoped_ptr<int> pA(new int(20)); 
    boost::scoped_ptr<int> pB(new int(20)); 

    boost::swap(pA, pB); 
} 

但應該明確的是,這是行不通的:

#include <boost/scoped_ptr.hpp> 

int main() 
{ 
    int* pA = new int(10); 
    int *pB = new int(20); 

    boost::swap(pA, pB); 

    delete pA; 
    delete pB; 
} 

因爲boost/scoped_ptr.hpp沒有提供(實際上沒有責任提供)的boost::swap一般實現。如果你想使用一般boost::swap,你必須包括boost/swap.hpp

#include <boost/scoped_ptr.hpp> 
#include <boost/swap.hpp> 

int main() 
{ 
    int* pA = new int(10); 
    int *pB = new int(20); 

    boost::scoped_ptr<int> pC(new int(20)); 
    boost::scoped_ptr<int> pD(new int(20)); 

    boost::swap(pA, pB); 
    boost::swap(pC, pD); 

    delete pA; 
    delete pB; 
} 

這樣。如果你有Boost可以做,不要回退到使用std::swap的東西。

4

這歸結爲交換習慣用法,或用戶代碼如何實現交換。在命名空間N一種T有一組成員m1的... mN實施swap的推薦的方法是:

namespace N { 
    void swap(T& lhs, T& rhs) { 
     using std::swap; 
     swap(lhs.m1, rhs.m1); 
     ... 
     swap(lhs.mN, rhs.mN); 
    } 
} 

成語採用ADL(參數依賴查找)的優勢。它首先將std::swap的定義注入到範圍中,以便在沒有更好的過載存在的情況下可用交換特定元素。然後,它使用不合格的免費功能swap,知道如果任何mn成員Tn類型定義了一個免費的功能互換,ADL將使其範圍專業swap將使用而不是std::swap

什麼文件的意思是,你不應該叫ptr1.swap(ptr2),而是不合格swap(ptr1, ptr2)交換任何元素包括scoped_ptr對象,按照上述的成語。也就是說,如果你實現你的交換,那麼swap函數不需要改變,因爲你的成員類型會發生變化,包括指針是否只是一個原始指針或scoped_ptr

+0

在重載解析期間,非模板總是優先於模板,所以名稱空間範圍的非模板交換優先於boost :: swap和std :: swap。 [參考](http://stackoverflow.com/a/6115281/391104) – q0987 2012-03-13 19:14:59

+0

參數依賴查找(ADL)或參數依賴名稱查找[ADL](http://en.wikipedia.org/wiki/Argument -dependent_name_lookup) – q0987 2012-03-13 19:19:33

+0

爲什麼不使用'boost :: swap'交換指針?其存在的整個目的是不必使用'std :: swap'的東西。 – GManNickG 2012-03-13 19:56:36