Template class method specialization

Suppose I have the following class:

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

How to write a specialized version of a function for T = float (or any other type)?

Note. A simple overload will not be enough, because I want the function to be available only for T = float (that is, MyClass :: SetValue (float) does not make sense in this case).

+6
source share
2 answers
 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); } }; 

or (partial specialized specialization):

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

or, if you want functions to have different signatures

 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> { }; 
+8
source

Of course. It's just that it should be overload :)

 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
source

Source: https://habr.com/ru/post/927654/


All Articles