컨테이너가 어떤 것이든지 포함하는 아이템 포인터를 알아서 삭제해주는 함수를 한줄로 작성해보자.
또, 이런 컨테이너가 재귀적으로 다른 컨테이너를 포함한다고 하더라도 한줄 짜리 함수면 좋겠다.
1. 일단 템플릿 함수가 필요할 것이다.
1 2 3 4 5 6 7 | template < class T > void DeleteSTLContainer( T* pContainer ) { std::for_each( pContainer->begin(), pContainer->end(), DeleteSTLContainerNode() ); pContainer->clear(); T().swap( *pContainer ); } |
2. 위의 템플릿 함수에서 사용하는 함수자가 필요하군.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class DeleteSTLContainerNode { public : template < class VALUE > void operator () ( VALUE& V ) { delete V; } template < class KEY, class VALUE > void operator () ( std::pair< KEY, VALUE >& P ) { delete P.second; } }; |
3. 재귀적으로 호출하기 위해서는 템플릿 특화를 사용해야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | class DeleteSTLContainerNodeRecursively { template < typename VALUE > struct DeleteImpl { void operator () ( VALUE& V ) { delete V; } }; template < typename VALUE > struct DeleteImpl < std::vector< VALUE >* > { void operator () ( std::vector< VALUE >* C ) { DeleteSTLContainerRecursively( C ); delete C; } }; template < typename VALUE > struct DeleteImpl < std::list< VALUE >* > { void operator () ( std::list< VALUE >* C ) { DeleteSTLContainerRecursively( C ); delete C; } }; template < typename KEY, typename VALUE > struct DeleteImpl < std::map< KEY, VALUE >* > { void operator () ( std::map< KEY, VALUE >* C ) { DeleteSTLContainerRecursively( C ); delete C; } }; // ... 필요한 컨테이너들이 있으면 더 등록 public : template < class VALUE > void operator () ( VALUE& V ) { DeleteImpl< VALUE > Deleter; Deleter( V ); } template < class KEY, class VALUE > void operator () ( std::pair< KEY, VALUE >& P ) { DeleteImpl< VALUE > Deleter; Deleter( P.second ); } }; // ... 위의 함수자를 사용하는, 실제로 사용할 함수 template < class T > void DeleteSTLContainerRecursively( T* pContainer ) { std::for_each( pContainer->begin(), pContainer->end(), DeleteSTLContainerNodeRecursively() ); pContainer->clear(); T().swap( *pContainer ); } |
'Code Snippets > Template' 카테고리의 다른 글
STL bind (0) | 2010.08.26 |
---|---|
Type Traits (0) | 2010.08.25 |