2013-05-14 18 views
9

Próbuję utworzyć klasę do łatwego zarządzania zasobami (ResourceManager).szablon włącz jeśli jest wskaźnikiem

Do tego używam szablonu z C++ 11.

Oto, co zrobić:


template<class K,class T> 
class ResourceManager 
{ 
    public: 
     ResourceManager(); 
     ~ResourceManager(); 

     /* code */ 

     void clear(); 

    private : 
     std::unordered_map<K,T> resource; 

     template <bool b> 
     void clear(); 
}; 

template<class K,class T> 
void ResourceManager<K,T>::clear() 
{ 
    clear<std::is_pointer<T>::value>(); 
}; 

template<class K,class T> 
template<bool b> 
void ResourceManager<K,T>::clear<b>() 
{ 
    for(auto& x:resource) 
    delete x.second; 
    resource.clear(); 
} 

template<class K,class T> 
template<> 
void ResourceManager<K,T>::clear<false>() 
{ 
    resource.clear(); 
} 

Krótko mówiąc, staram się mieć inny comportement jeśli T jest wskaźnik (automatyczne usuwanie).

Próbowałem użyć std::enable_if, ale nie rozumiałem, jak to działa i czy jest to właściwy sposób.

Jeśli ktoś mógłby mi pomóc ...


Kod można znaleźć tutaj: https://github.com/Krozark/ResourceManager

Odpowiedz

11

mógłby po prostu użyć rozwiązanie oparte na przeciążenia i naklejki dyspozytorni. Twoja funkcja clear() członek będzie zdefiniowana w ten sposób:

void clear() 
{ 
    do_clear(std::is_pointer<T>()); 
} 

I klasa szablon obejmowałby dwa przeciążeniem do_clear(), w następujący sposób:

template<class K,class T> 
class ResourceManager 
{ 

    // ... 

private: 

    void do_clear(std::true_type); 
    void do_clear(std::false_type); 

}; 

I tu jest definicja tych dwóch funkcji składowych:

template<class K, class T> 
void ResourceManager<K, T>::do_clear(std::true_type) 
{ 
    for(auto& x:resource) 
    delete x.second; 
    resource.clear(); 
} 

template<class K, class T> 
void ResourceManager<K, T>::do_clear(std::false_type) 
{ 
    resource.clear(); 
} 

Należy jednak zauważyć, że zawsze można skorzystać z inteligentnych wskaźników i innych owijaczy zasobów RAII, aby uniknąć kalków ng delete jawnie na surowych wskazówkach.

+0

To jest dokładnie to, co chciałem zrobić. Dziękuję Ci. – Krozark

+4

@Krozark: Cieszę się, że pomogło. Dodałem poradę: rozważ użycie owijaczy RAII, takich jak inteligentne wskaźniki, więc nie musisz w ogóle dbać o część "delete";) –

+0

+ 1 fajne rozwiązanie, Andy. – WhozCraig

Powiązane problemy