Kro*_*ark 9 c++ templates std c++11
我尝试创建一个类来轻松管理资源(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();
};
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
简而言之,如果T是指针(自动删除),我会尝试使用不同的comportement .
我尝试使用std::enable_if,但我不明白它是如何运作的,如果这是正确的方法.
如果有人能帮助我......
代码可以在这里找到:https://github.com/Krozark/ResourceManager
And*_*owl 11
您可以使用基于重载和标记分派的解决方案.您的clear()成员函数将以这种方式定义:
void clear()
{
do_clear(std::is_pointer<T>());
}
Run Code Online (Sandbox Code Playgroud)
您的类模板将包含两个重载do_clear(),如下所示:
template<class K,class T>
class ResourceManager
{
// ...
private:
void do_clear(std::true_type);
void do_clear(std::false_type);
};
Run Code Online (Sandbox Code Playgroud)
以下是这两个成员函数的定义:
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();
}
Run Code Online (Sandbox Code Playgroud)
但请注意,您始终可以选择使用智能指针和其他RAII资源包装器,以避免delete在原始指针上显式调用.
| 归档时间: |
|
| 查看次数: |
1204 次 |
| 最近记录: |