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

C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数),第1张

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

转自:https://www.cnblogs.com/zhoug2020/p/6581477.html

 

模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现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         else12             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         else24             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 };
总结

以上是内存溢出为你收集整理的C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)全部内容,希望文章能够帮你解决C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1222899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存