C++模板编程中只特化模板类的一个成员函数


模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现1、2个成员函数即可。在这种情况下,如果全部重写该模板类的所有成员函数,不但会增加工作量,也不利于代码的维护。

例如下面的类模板A,只有在模板参数是char*时才需要特化成员函数func(),但其他的成员函数都不需要特化:

复制代码
 1 template <typename _Ty>
 2 struct A  3 {  4 // 其他成员函数a  5 // 其他成员函数b  6 // ......  7 void func()  8  {  9 std::cout << "common type." << std::endl; 10  } 11 }; 12 13 int main() 14 { 15 A<int> i; 16  i.func(); 17 18 A<char*> c; 19  c.func(); 20 21 return 0; 22 }
复制代码

方法一:通过运行时类型识别,这个方法最简单

复制代码
 1 template <typename _Ty>
 2 struct A  3 {  4 // 其他成员函数a  5 // 其他成员函数b  6 // ......  7 void func()  8  {  9 if (typeid(_Ty) == typeid(char*)) 10 std::cout << "common type." << std::endl; 11 else 12 std::cout << "special type." << std::endl; 13  } 14 };
复制代码

方法二:通过类的成员函数模板特化来实现,这个方法也比较简单

复制代码
 1 template <typename _Ty>
 2 struct A  3 {  4 // 其他成员函数a  5 // 其他成员函数b  6 // ......  7 template <typename __Ty>  8 void funcImpl()  9  { 10 std::cout << "common type." << std::endl; 11  } 12 13 template <> 14 void funcImpl<char*>() 15  { 16 std::cout << "special type." << std::endl; 17  } 18 19 void func() 20  { 21 funcImpl<_Ty>(); 22  } 23 };
复制代码

方法三:通过一个嵌套模板类的特化来实现

复制代码
 1 template <typename _Ty>
 2 struct A  3 {  4 // 其他成员函数a  5 // 其他成员函数b  6 // ......  7 template <typename __Ty>  8 struct IsCharPType  9  { 10 const static bool b = false; 11  }; 12 13 template<> 14 struct IsCharPType<char*> 15  { 16 const static bool b = true; 17  }; 18 19 void func() 20  { 21 if (IsCharPType<_Ty>::b) 22 std::cout << "special type." << std::endl; 23 else 24 std::cout << "common type." << std::endl; 25  } 26 };
复制代码

方法四:先定义一个嵌套的类模板,通过重载函数实现(函数的参数类型不同)

复制代码
 1 template <typename _Ty>
 2 struct A  3 {  4 // 其他成员函数a  5 // 其他成员函数b  6 // ......  7 template <typename __Ty>  8 struct TypeClass  9  { 10  }; 11 12 template <typename __Ty> 13 void funcImpl(const TypeClass<__Ty>&) 14  { 15 std::cout << "common type." << std::endl; 16  } 17 18 void funcImpl(const TypeClass<char*>&) 19  { 20 std::cout << "special type." << std::endl; 21  } 22 23 void func() 24  { 25 funcImpl(TypeClass<_Ty>()); 26  } 27 };
复制代码

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM