分类
C++的模板分为函数模板和类模板。
函数模板:
template<typename T>
T myAdd(T a, T b) {return a + b;
}
类模板:
template <typename T>
class A {...
}
注意:结构体做成的模板也是类模板;C++中类和结构体的唯一区别就是默认访问权限是private还是public。
主模板和特化
主模板相当于基类,特化相当于对基类的派生;
特化分为全特化(实例化模板的某个具体类型,比如int,float)和偏特化(实例化模板的一类类型,比如指针T*,const T)。
举例说明,主模板:
template <typename T>
class A {... // 默认实现,可以和T无关,一般情况也T无关
}
全特化 —— 针对int类型:
template <>
class A<int> {...
}
偏特化 —— 针对指针:
template <typename T>
class A<T*> {...
}
有几点需要注意:
- template<>为主模板全特化的标志,而class A<T*>为主模板偏特化标志;它们格式固定,不会在普通模板中出现
- 调用的时候,如果没有匹配到任何类型,就会使用主模板的默认定义 —— 这点和基类派生类一致
- 全特化指的是特定的一个类型,比如int,float;偏特化反而指的是一类类型,比如指针,const;不要理解错了
适用场景
普通模板要处理的场景为:只有类型不同,实现完全相同的场景;
主模板和全特化要处理的场景是:不同类型的内部实现均不相同,具体到单个类型;
主模板和偏特化要处理的场景是:不同类型的内部实现均不相同,具体到一类类型。