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
To jest dokładnie to, co chciałem zrobić. Dziękuję Ci. – Krozark
@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";) –
+ 1 fajne rozwiązanie, Andy. – WhozCraig