2011-04-19 323 views
8

爲shared_ptr的的等於運算符的定義如下:C++的shared_ptr相等運算

template<class T, class U> inline bool operator==(
    shared_ptr<T> const & a, shared_ptr<U> const & b) 
{ 
    return a.get() == b.get(); 
} 

這似乎打破。將平等轉發給a和b所指的是不是更好?或者這會對圖書館用戶造成不公平的限制(因爲他們必須提供一個相等的操作符)( )?

如果我有一個包含shared_ptrs的map或hash_table,那麼當前定義 使等式不可用。例如,考慮

std::map<int, std::tr1::shared_ptr<T> > m1, m2; 

我們不想檢查m1和m2中每個int的ptrs是否指向相同的值?

我可以通過展平m1,m2來實現我自己的平等(從每個平面構建集合, 取消引用shared_ptrs)。是否有一個STL技巧可以完成這個 或其他一些方式來測試shared_ptrs存在的平等嗎?

+7

這取決於你平等的意思。對於指向「指向相同對象」的普通指針。對我來說,把這種平等概念擴展到shared_pointer似乎是合理的。 – 2011-04-19 21:39:18

回答

5

我認爲這個想法是,比較兩個shared_ptr實例與比較兩個指針非常有用。如果你想要一個std::map包含shared_ptr普通的指向對象的舊指針,你必須用比較指向對象的東西來覆蓋謂詞。

在比較兩張地圖的情況下,您可能需要使用帶謂詞的版本std::equal

31

它沒有被破壞,因爲shared_ptr在概念上是一個指針,因此它實現了指針式的等式。當你測試兩個指針是否相等時,你想知道它們是否指向內存中的相同位置。

0

剛碰到一個問題,我可以使用兩種類型的等價。無序的shared_ptr集合,我希望等價物基於指向的對象的內容。這可以使用散列的模板專門化和重載的==來實現。現在我有另一個包含這些指針的容器(一個邊緣入侵列表),但由於我們已經知道它們是唯一的,因爲我們使用了該集合,所以我們可以依靠指針等價。儘管原始等價也可以起作用,但在第二種情況下依賴指針等價可能更有效 - 這取決於正在比較的實例中的數據量。

所以,要回答這個問題。不,它不會更好,因爲您如何使用所提供的靈活性取決於解決的問題。