关闭

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

发表于:2015-7-14 10:39

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:C.g    来源:51Testing软件测试网采编

  模板编程中如果要特化或偏特化(局部特化)一个类模板,需要特化该类模板的所有成员函数。类模板中大多数成员函数的功能可能是一模一样的,特化时我们可能只需要重新实现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 };
  方法二:通过类的成员函数模板特化来实现,这个方法也比较简单
1template<typename_Ty>
2structA
3{
4//其他成员函数a
5//其他成员函数b
6//......
7template<typename__Ty>
8voidfuncImpl()
9{
10std::cout<<"commontype."<<std::endl;
11}
12
13template<>
14voidfuncImpl<char*>()
15{
16std::cout<<"specialtype."<<std::endl;
17}
18
19voidfunc()
20{
21funcImpl<_Ty>();
22}
23};
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号