2012-10-13 14 views
6

मान लीजिए मैं निम्नलिखित वर्ग है विशेषज्ञता:टेम्पलेट वर्ग विधि

template <typename T> 
class MyClass 
{ 
public: 
    void SetValue(const T &value) { m_value = value; } 

private: 
    T m_value; 
}; 

मैं समारोह के एक विशेष संस्करण कैसे लिख सकते हैं, टी = नाव के लिए (या किसी भी अन्य प्रकार)?

नोट: एक साधारण अधिभार पर्याप्त नहीं होगा क्योंकि मैं केवल टी = फ्लोट के लिए फ़ंक्शन उपलब्ध होना चाहता हूं (यानी MyClass :: SetValue (float) इस उदाहरण में कोई समझ नहीं लेता है)।

उत्तर

8
template <typename T> 
class MyClass { 
private: 
    T m_value; 

private: 
    template<typename U> 
    void doSetValue (const U & value) { 
     std::cout << "template called" << std::endl; 
     m_value = value; 
    } 

    void doSetValue (float value) { 
     std::cout << "float called" << std::endl; 
    } 

public: 
    void SetValue(const T &value) { doSetValue (value); } 

}; 

या (आंशिक टेम्पलेट विशेषज्ञता):

template <typename T> 
class MyClass 
{ 
private: 
    T m_value; 

public: 
    void SetValue(const T &value); 

}; 

template<typename T> 
void MyClass<T>::SetValue (const T & value) { 
    std::cout << "template called" << std::endl; 
    m_value = value; 
} 

template<> 
void MyClass<float>::SetValue (const float & value) { 
    std::cout << "float called" << std::endl; 
} 

या, आप कार्यों अलग हस्ताक्षर

template<typename T> 
class Helper { 
protected: 
    T m_value; 
    ~Helper() { } 

public: 
    void SetValue(const T &value) { 
     std::cout << "template called" << std::endl; 
     m_value = value; 
    } 
}; 

template<> 
class Helper<float> { 
protected: 
    float m_value; 
    ~Helper() { } 

public: 
    void SetValue(float value) { 
     std::cout << "float called" << std::endl; 
    } 
}; 

template <typename T> 
class MyClass : public Helper<T> { 
}; 
करना चाहते हैं, तो
+0

आपके आंशिक टेम्पलेट विशेषज्ञता जवाब ने सिर पर नाखून मारा! बस मैं क्या देख रहा था, धन्यवाद। –

+0

दरअसल, यह आपके दूसरे उदाहरण में स्पष्ट टेम्पलेट विशेषज्ञता है: यदि आप वहां थे, तो आपको 1 में से 1 टेम्पलेट तर्क प्रदान कर रहे हैं, आपको 2 प्रदान करने की आवश्यकता होगी। एक और बिंदु यह है कि ये विशेष कार्य स्पष्ट रूप से यदि आप टेम्पलेट को हेडर फ़ाइल में डालते हैं और इसे दो बार शामिल करते हैं तो एक अलग संकलन इकाई (हेडर फ़ाइल नहीं) में होना आवश्यक है। – Markus

2

निश्चित रूप से आप कर सकते हैं। यह सिर्फ यह है कि यह एक अधिभार :) होना चाहिए

template <typename T> 
class MyClass 
{ 
public: 
    template<class U> 
    void SetValue(const U &value) { m_value = value; } 
    void SetValue(float value) {do special stuff} 
private: 
    T m_value; 
}; 

int main() 
{ 
    MyClass<int> mc; 
    mc.SetValue(3.4); // the template member with U=double will be called 
    mc.SetValue(3.4f); // the special function that takes float will be called 

    MyClass<float> mcf; //compiles OK. If the SetValue were not a template, 
    // this would result in redefinition (because the two SetValue functions 
    // would be the same 
} 
+2

लेकिन मैं केवल तभी अधिभार चाहता हूं जब टी = फ्लोट। अन्यथा, आपके पास 'MyClass :: SetValue (float)' हो सकता है जो कोई समझ नहीं लेगा। –

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