2013-05-14 22 views
9

Kaynakların kolayca yönetilmesi için bir sınıf oluşturmaya çalışıyorum (ResourceManager).şablonu etkinse, işaretçi

Bunun için şablonu C++ 11 ile kullanıyorum.

İşte böyle yapar: Kısacası


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

, ben T bir işaretçi (otomatik silme) ise farklı comportement sahip deneyin.

std::enable_if'u kullanmayı denedim, ancak nasıl çalıştığını anlamadım ve bu doğru yol buysa.

birisi bana yardımcı olabilir Eğer

...


Kod burada bulunabilir: https://github.com/Krozark/ResourceManager

cevap

11

sadece aşırı ve etiket sevkiyat dayalı bir çözüm kullanabilirsiniz. Sizin clear() üye fonksiyonu bu şekilde tanımlanabilir olacaktır:

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

Ve aşağıdaki gibi do_clear() iki aşırı yükleri yer alacağını sınıf şablonu:

template<class K,class T> 
class ResourceManager 
{ 

    // ... 

private: 

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

}; 

Ve burada bu iki üye fonksiyonlarının tanımı şöyledir:

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

Bununla birlikte, her zaman için akıllı işaretçiler ve diğer RAII kaynak sarmalayıcılarını kullanma olasılığınız vardır. ng delete açıkça ham işaretçiler üzerinde.

+0

Tam olarak yapmak istediğim şey budur. Teşekkür ederim. – Krozark

+4

@Krozark: Yardım ettiğine sevindim. Bir tavsiye ekledim: akıllı işaretçiler gibi RAII sarmalayıcıları kullanmayı düşünün, böylece "delete" kısmına önem vermek zorunda değilsiniz;) –

+0

+1 güzel çözüm, Andy. – WhozCraig