मैं एक टेम्पलेट वर्ग लिख रहा हूं, और मैं केवल एक निश्चित टेम्पलेट प्रकार के लिए एक अतिरिक्त विधि मौजूद होने की अनुमति देना चाहता हूं। वर्तमान में विधि सभी टेम्पलेट प्रकारों के लिए मौजूद है, लेकिन सभी अन्य प्रकारों के लिए संकलन त्रुटि का कारण बनती है।क्या मैं सदस्य फ़ंक्शन पर 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 एक्सेसर विधि बनाने में समय बर्बाद नहीं करेगा।
'उपयोगिता 2 ' से आपका क्या मतलब है "वैध" है? –
Nim
उपयोगिता 2 आधार पर एक विधि कॉल करने का प्रयास करता है। केवल एक प्रकार का आधार वास्तव में उस विधि में है। – Tim
http://stackoverflow.com/questions/2937425/boostenable-if-class-template-method – Anycorn