2015-11-11 8 views
5

shared_ptr管理対象オブジェクトを比較するための標準的な述語はありますか?shared_ptrオブジェクトの等価性を比較する

template<typename T, typename U> 
inline bool target_equal(const T& lhs, const U& rhs) 
{ 
    if(lhs && rhs) 
    { 
     return *lhs == *rhs; 
    } 
    else 
    { 
     return !lhs && !rhs; 
    } 
} 

私は上記のコードに似た何かをしたいが、標準液がすでにある場合はそれを私の自己を定義する避けることができます。

+2

は、あなたがそれらを欽慕することができますので、必要があります:私は先の尖った物体が同じであるとの共有ポインタのいずれかがnullで、もう一つは、それがない場合はfalseを返すかどうかを確認するこのバージョンを提案していますか? – 101010

+3

@ 101010: 'if'ステートメントはそこにあります。なぜなら、あなたはそれらを逆参照できないかもしれないからです。 – MSalters

+1

しかし、逆参照するときにnulptrを処理する必要があります –

答えて

6

いいえ、このような述語はありません。ラムダ関数を使用する方法もありますが、それでも自分で定義する必要があります。

2

いいえ、標準的な解決策はありません。 shared_ptr等の等価演算子は、管理オブジェクトではなくポインタのみを比較します。 解決策は問題ありません。

template<class T, class U> 
bool compare_shared_ptr(const std::shared_ptr<T>&a,const std::shared_ptr<U>&b) 
{ 
    if(a == b) return true; 
    if(a && b) return *a == *b; 
    return false; 
} 
+0

これは、OPのバージョンが 'true'を返す一方、一方のポインタがnullの場合は' false'を返します。 – Quentin

+0

確かに。 1つの共有ポインタがnullで、もう1つはそうではないが、OPのバージョンが異なっているときにfalseを返す方が意味があると主張することができます。それを反映する答えを編集しました。 – fortuna

関連する問題