2013-05-14 17 views
9

リソースを簡単に管理するクラスを作成しようとしました(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ポインタ(自動削除)がある場合は、別のcomportementを持ってしてみてください。

私はstd::enable_ifを使用しようとしましたが、それがどのように機能しているか、そしてこれが正しい方法であるかどうかはわかりませんでした。

誰かが私を助けることができれば...


コードはここで見つけることができます:https://github.com/Krozark/ResourceManager

答えて

11

あなただけの過負荷およびタグのディスパッチに基づくソリューションを使用することができます。あなたのclear()メンバ関数は、このように定義されます。

void clear() 
{ 
    do_clear(std::is_pointer<T>()); 
} 

を、次のようにあなたのクラステンプレートは、do_clear()の2つのオーバーロードが含まれます:

template<class K,class T> 
class ResourceManager 
{ 

    // ... 

private: 

    void do_clear(std::true_type); 
    void do_clear(std::false_type); 

}; 

そしてここでは、これら2つのメンバ関数の定義である:

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リソースラッパーを使用してカルイを回避するオプションがあることに注意してくださいng deleteをrawポインタに明示的に指定します。

+0

これはまさに私がやりたいことです。ありがとうございました。 – Krozark

+4

@Krozark:喜んで助けました。私はアドバイスを追加しました:スマートポインタのようなRAIIラッパーの使用を検討するので、 'delete'部分はまったく気にする必要はありません;) –

+0

+1の素晴らしい解決策、Andy。 – WhozCraig

関連する問題