我尝试创建一个类来轻松管理资源(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();
}
简而言之,如果T
是指针(自动删除),我会尝试不同的竞争。
我尝试使用std::enable_if
,但我不明白它是如何运作的,如果这是正确的方法。
如果有人可以帮助我......
答案 0 :(得分: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资源包装器,以避免在原始指针上显式调用delete
。