블로그 이미지

3DMP engines

3D그래픽스 물리 수학, 프로그래밍 GPU Shader 게임엔진 알고리즘 디자인패턴 matlab etc..

by 송정헌


boost 에도 unordered_set 이 있으며 사용법은 유사함






http://blog.naver.com/tchar/150105434685



아래의 예를 보자.

#include <memory>
#include <unordered_set>

void main()
{
 std::unordered_set< std::shared_ptr<int> > s;
 s.insert( std::shared_ptr< int >( new int(10) ) );
}

해시 컨테이너중 하나인 unordered_set 에 shared_ptr< int > 타입을 사용하였다. 컴파일 해보면 오류가 발생한다.

 

해시 컨테이너는 템플릿 인수로 해시 함수객체의 타입을 받고, 디폴트로 std::hash<T> 가 사용된다. 대략 다음처럼 선언되어 있다.

// functional 헤더

template< typename T >
class hash : public unary_function< T, size_t >
{

public:

 size_t operator()( const T &value ) const
 { ... (size_t) value ... }
};

이외에도 T를 T*나 double 등으로 특수화한 버전들이 여럿 존재하고, 그것들은 위의 함수객체를 이용하도록 작성되어 있다. 안타깝게도 shared_ptr에

 

대한 특수화 버전은 제공되지 않고, 그래서 위의 함수객체가 직접 사용된다. opreator() 함수의 몸체를 보면, 값을 size_t로 형변환함을 알 수 있다.

 

그러나 T가 shared_ptr일 때, shared_ptr은 size_t로의 암시적 형변환을 제공하지 않는다. 그래서 shared_ptr 타입에 대해서 해시 컨테이너의

 

해시 함수를 디폴트로 했을 때 오류가 발생하게 되는 것이다. 이를 해결하기 위해 직접 shared_ptr 의 특수화 버전을 제공하면 된다.

 

아래는 위에서 오류가 발생했던 코드에 특수화 버전을 추가해서 오류가 없도록 한 것이다.

#include <memory>
#include <unordered_set>

template< typename T >
class std::hash< std::shared_ptr< T > > : public unary_function< shared_ptr< T >, size_t >
{

public:

 size_t operator()( const shared_ptr< T > &value ) const
 { return hash< T* >()( value.get() ); }
};

void main()
{
 std::unordered_set< std::shared_ptr<int> > s;
 s.insert( std::shared_ptr< int >( new int(10) ) );
}

shared_ptr 로 특수화한 함수객체의 몸체를 보면, shared_ptr< T >::get() 함수를 이용하여 포인터를 얻고 그 포인터를 T* 로 특수화된 함수객체에

 

넘기고 있다. 이제 제대로 컴파일되는 것을 확인할 수 있다.

반응형

'메타프로그래밍 > Boost::' 카테고리의 다른 글

boost::shared_ptr  (0) 2012.11.18
boost::function  (0) 2012.11.13
Boost::[bind, mem_fn ] 과 STL , 멤버함수 조합사용  (0) 2012.11.13
boost::bind  (0) 2012.11.13
boost::mem_fn  (0) 2012.11.13

+ Recent posts