'generic deletion'에 해당되는 글 1건

  1. 2010.08.25 Delete STL Container
Code Snippets/Template2010. 8. 25. 12:15

컨테이너가 어떤 것이든지 포함하는 아이템 포인터를 알아서 삭제해주는 함수를 한줄로 작성해보자.
또, 이런 컨테이너가 재귀적으로 다른 컨테이너를 포함한다고 하더라도 한줄 짜리 함수면 좋겠다.

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
Posted by codevania