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ポインターがポインター (自動削除) である場合は、別の振る舞いをしようとします。

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

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


コードはここにあります: https://github.com/Krozark/ResourceManager

4

1 に答える 1

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();
}

deleteただし、スマート ポインターやその他の RAII リソース ラッパーを使用して、生のポインターでの明示的な呼び出しを回避するオプションが常にあることに注意してください。

于 2013-05-14T23:19:48.617 に答える