模板启用if是指针

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在原始指针上显式调用.

  • @Krozark:很高兴它有所帮助.我添加了一个建议:考虑使用智能指针等RAII包装器,所以你根本不必关心`delete`部分;) (4认同)