gpt4 book ai didi

c++ - 如果是指针,则启用模板

转载 作者:可可西里 更新时间:2023-11-01 16:36:26 26 4
gpt4 key购买 nike

我尝试制作一个类来轻松管理资源(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

最佳答案

您可以只使用基于过载和标记分派(dispatch)的解决方案。您的 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

关于c++ - 如果是指针,则启用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16554192/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com