模板启用它是指针
template enable if is pointer
我尝试创建一个类来轻松管理资源(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
,但我不明白它是如何工作的,如果这是正确的方法。
如果有人能帮我…
代码可以在这里找到:https://github.com/Krozark/ResourceManager
您可以使用基于重载和标记调度的解决方案。您的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
。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 编译时未启用intel oneApi CUDA支持
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 启用优化时的堆栈指针比较异常
- 将派生的类启用到基类指针
- "this"指针是否启用了 RTTI?
- 如何启用帧指针
- 模板启用它是指针