2011-04-19 2 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가 포함 된 맵 또는 hash_table이있는 경우 현재 정의 은 동등성을 사용할 수 없게 만듭니다. 예를 들어, 다음과 같습니다.

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

m1과 m2의 각 int에 대한 ptrs가 동일한 값을 가리키고 있는지 확인하지 않겠습니까?

m1, m2 out을 평평하게 처리하여 각자의 평등을 구현할 수 있습니다 (길을 따라 역 참조). 이 또는 shared_ptrs가있는 상태에서 평등을 테스트하는 다른 방법을 수행 할 STL 트릭이 있습니까?

+7

평등의 의미에 따라 다릅니다. "동일한 객체를 가리키는"것을 의미하는 일반 포인터의 경우. 나에게이 평등 개념을 shared_pointer로 확장하는 것이 합당한 것처럼 보인다. –

답변

5

저는 두 개의 포인터를 비교하는 것보다 두 개의 shared_ptr 인스턴스를 비교하는 것이 유용하다고 생각합니다. std::mapshared_ptr s 또는 일반 개체 포인터가있는 개체를 사용하려면 두 경우 모두 해당 개체를 비교하는 무언가로 조건자를 재정의해야합니다.

두지도를 비교하는 경우 술어를 사용하는 std::equal 버전을 사용하고 싶을 것입니다.

31

shared_ptr은 개념적으로 포인터이므로 포인터를 사용하여 평등을 구현합니다. 두 포인터가 동등 함을 테스트 할 때 포인터가 메모리의 같은 위치를 가리키고 있는지를 알고 싶습니다.

0

두 가지 유형의 동등성을 모두 사용할 수있는 문제가 발생했습니다. 정렬되지 않은 shared_ptr 집합입니다. 여기서 가리키는 객체의 내용을 기반으로 동등성을 원했습니다. 이것은 해시 템플리트 및 오버로드 된 ==를 사용하여 구현할 수 있습니다. 이제는 이러한 포인터 (가장자리 부각 목록)를 포함하는 다른 컨테이너가 있지만 집합을 사용했기 때문에 고유하다는 것을 이미 알고 있기 때문에 포인터 등가성에 의존 할 수 있습니다. 원래의 등가성도 작동하지만 두 번째 경우의 포인터 동등성에 의존하는 것이 더 효율적일 수 있습니다. 이는 비교되는 인스턴스에있는 데이터의 양에 따라 다릅니다.

그래서 질문에 답하십시오. 더 나은 것은 아니 었습니다. 제공되는 유연성을 사용하는 방법은 해결되는 문제에 달려 있기 때문입니다.