2013-05-14 3 views
9

मैं संसाधनों को आसानी से प्रबंधित करने के लिए कक्षा बनाने का प्रयास करता हूं (संसाधन प्रबंधक)।टेम्पलेट सक्षम है अगर सूचक

इसके लिए मैं सी ++ 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() के दो भार के शामिल होंगे:

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 स्पष्ट रूप से कच्चे पॉइंटर्स पर।

+0

यह वही है जो मैं करना चाहता था। धन्यवाद। – Krozark

+4

@ क्रोज़र्क: खुशी हुई यह मदद की। मैंने एक सलाह दी: स्मार्ट पॉइंटर्स जैसे आरएआईआई रैपर का उपयोग करने पर विचार करें, इसलिए आपको 'हटाएं' भाग की परवाह नहीं है;) –

+0

+1 अच्छा समाधान, एंडी। – WhozCraig

संबंधित मुद्दे