2013-05-14 9 views
9

Cerco di creare una classe per gestire facilmente le risorse (ResourceManager).abilitazione modello se è puntatore

Per questo uso il modello con C++ 11.

Ecco quello che faccio:


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(); 
} 

Insomma, cerco di avere comportement diverso se T è un puntatore (auto cancellazione).

Ho provato a utilizzare std::enable_if, ma non ho capito come funzionava, e se questo è il modo giusto di prendere.

Se qualcuno mi potrebbe aiutare ...


codice può essere trovato qui: https://github.com/Krozark/ResourceManager

risposta

11

si potrebbe utilizzare una soluzione basata su tag sovraccarichi e dispacciamento. La funzione clear() membro sarebbe definita in questo modo:

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

E il vostro modello di classe dovrebbe includere due overload di do_clear(), come segue:

template<class K,class T> 
class ResourceManager 
{ 

    // ... 

private: 

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

}; 

Ed ecco la definizione di queste due funzioni membro:

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(); 
} 

Si noti, tuttavia, che si ha sempre la possibilità di utilizzare puntatori intelligenti e altri wrapper di risorse RAII per evitare calli ng delete esplicitamente su puntatori grezzi.

+0

Questo è esattamente ciò che volevo fare. Grazie. – Krozark

+4

@Krozark: Sono contento che mi abbia aiutato. Ho aggiunto un consiglio: considera l'utilizzo di wrapper RAII come puntatori intelligenti, quindi non ti interessa affatto la parte 'delete';) –

+0

+1 bella soluzione, Andy. – WhozCraig