2011-02-02 15 views
7

मैं एक टेम्पलेट वर्ग लिख रहा हूं, और मैं केवल एक निश्चित टेम्पलेट प्रकार के लिए एक अतिरिक्त विधि मौजूद होने की अनुमति देना चाहता हूं। वर्तमान में विधि सभी टेम्पलेट प्रकारों के लिए मौजूद है, लेकिन सभी अन्य प्रकारों के लिए संकलन त्रुटि का कारण बनती है।क्या मैं सदस्य फ़ंक्शन पर boost :: enable_if का उपयोग कर सकता हूं?

यह शिकायत यह है कि यह एक अधिभारित ऑपरेटर() है। निश्चित नहीं है कि मैं क्या करना चाहता हूं वास्तव में यहां संभव है।

यहाँ मैं अब है:

template<typename T, typename BASE> 
class MyClass : public BASE 
{ 
public: 

    typename T& operator() (const Utility1<BASE>& foo); 
    typename T const& operator() (const Utility2<BASE>& foo) const; 
}; 

मैं T& संस्करण हमेशा उपलब्ध चाहते हैं, लेकिन T const& संस्करण केवल तभी उपलब्ध Utility2<BASE> मान्य है। अभी, दोनों विधियां मौजूद हैं, लेकिन Utility2<BASE> अमान्य है, तो कॉन्स्ट संस्करण का उपयोग करने का प्रयास एक अजीब संकलन त्रुटि देता है। मुझे एक समझदार त्रुटि होगी, या यहां तक ​​कि "कोई सदस्य कार्य नहीं" त्रुटि होगी।

क्या यह संभव है?

संपादित: बढ़ावा डॉक्स के माध्यम से पढ़ने के बाद, यहाँ है कि मैं क्या लेकर आए हैं, और यह काम करने के लिए लगता है:

template<typename T, typename BASE> 
class MyClass : public BASE 
{ 
public: 

    typename T& operator() (const Utility1<BASE>& foo); 

    template<typename U> 
    typename boost::enable_if<boost::is_same<Utility2<BASE>, U>, T>::type const & 
    operator() (const U& foo) const; 
}; 

ताकि विधि मौजूद नहीं है जब तक कि कोई इसका इस्तेमाल करने की कोशिश करता है Utility2 के साथ, और वे केवल उपयोगिता 2 बना सकते हैं यदि यह उस BASE प्रकार के लिए मान्य है। लेकिन जब यह उस BASE प्रकार के लिए मान्य नहीं है, तो MyClass एक्सेसर विधि बनाने में समय बर्बाद नहीं करेगा।

+0

'उपयोगिता 2 ' से आपका क्या मतलब है "वैध" है? – Nim

+0

उपयोगिता 2 आधार पर एक विधि कॉल करने का प्रयास करता है। केवल एक प्रकार का आधार वास्तव में उस विधि में है। – Tim

+0

http://stackoverflow.com/questions/2937425/boostenable-if-class-template-method – Anycorn

उत्तर

4

हां, यह संभव है, लेकिन कक्षा टेम्पलेट पैरामीटर के साथ सीधे नहीं। boost::enable_if केवल विधि पर टेम्पलेट पैरामीटर के साथ ही उपयोग किया जा सकता है। तो, एक छोटे से typedef उपयोग के साथ:

template<typename T, typename BASE> 
class MyClass : public BASE 
{ 
public: 
    typedef Utility2<BASE> util; 

    typename T& operator() (const Utility1<BASE>& foo); 

    template<typename U> 
    typename boost::enable_if<boost::is_same<util, U>, T>::type const & 
    operator() (const U& foo) const; 
}; 

यह काम करता है क्योंकि Utility2 केवल एक निश्चित आधार प्रकार से बनाया जा सकता है। तो यदि आधार प्रकार कुछ और है, तो ऑपरेटर() का कॉन्स संस्करण मौजूद नहीं होगा।

तो, यह एक बहुत मामूली बात है। यह मुझे ज्यादा लाभ नहीं पहुंचाता है। लेकिन यह करने के लिए साफ था।

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

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