3DMP engines
3D그래픽스 물리 수학, 프로그래밍 GPU Shader 게임엔진 알고리즘 디자인패턴 matlab etc..
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 |