2013-05-14 33 views
9

我試着做一個類來輕鬆管理資源(ResourceManager)。模板啓用如果是指針

爲此我使用C++ 11的模板。

這是我做的:


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

總之,我嘗試有不同comportement如果T是一個指針(自動刪除)。

我試過使用std::enable_if,但我不明白它是如何工作的,並且這是否是正確的方法。

如果有人可以幫助我...


代碼可以在這裏找到:https://github.com/Krozark/ResourceManager

回答

11

你可以只使用基於超載和標籤調度的解決方案。你clear()成員函數會被這樣定義的:

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

而且你的類模板將包括do_clear()兩個重載,如下所示:

template<class K,class T> 
class ResourceManager 
{ 

    // ... 

private: 

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

}; 

這裏是其中的兩個成員函數的定義:

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

但是,請注意,您始終可以選擇使用智能指針和其他RAII資源包裝來避免calli ng delete明確地在原始指針上。

+0

這正是我想要做的。謝謝。 – Krozark

+4

@Krozark:很高興幫助。我添加了一個建議:考慮使用RAII包裝,比如智能指針,所以你根本不必關心'delete'部分; –

+0

+1好的解決方案,Andy。 – WhozCraig