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