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

Posted dongzhiquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)相关的知识,希望对你有一定的参考价值。

转自: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         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 ;

以上是关于C++模板编程中只特化模板类的一个成员函数(花样特化一个成员函数)的主要内容,如果未能解决你的问题,请参考以下文章

C++模板(函数模板/类模板)

C++模板(函数模板/类模板)

C++中模板类成员函数的特化

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++模板详解:泛型编程模板原理非类型模板参数模板特化分离编译

C++模板