C++模板和特化
分类
C++的模板分为函数模板和类模板。
这是一个普通类模板:
// 主模板(通用版本)
template<typename T>
class MyContainer {
public:
void print() { std::cout << "Generic\n"; }
};
这是一个普通函数模板:
// 主模板(通用版本)
template<typename T>
void print_type(T x) {
std::cout << "Generic type\n";
}
按照模板定义,它表示针对类型T的操作。
注意:结构体做成的模板也是类模板;C++中类和结构体的唯一区别就是默认访问权限是private还是public。
特化
普通模板指的是:针对类型T的操作;
如果想要在T为特定类型时,有不同的操作,这就叫特化;
T为具体类型时,此时的特化为全特化;T为指针或者引用时,此时的特化是偏特化。
特化有固定的格式:
这是一个类模板针对的int的全特化:
template<>
class MyContainer<int> {
public:
void print() { std::cout << "type int\n"; }
};
这是一个函数模板针对const char*的全特化:
// 特化:当 T = const char* 时
template<>
void print_type<const char*>(const char* x) {
std::cout << "C-string: " << x << "\n";
}
这是一个类模板指针的偏特化:
// 偏特化:当 T 是指针类型时
template<typename T>
class MyContainer<T*> {
public:
void print() { std::cout << "Specialized for pointer\n"; }
};
// 使用
MyContainer<int*> p; // 匹配偏特化
理解
- 主模板相当于基类,特化相当于对基类的派生
- template<>为主模板全特化的标志,而class A<T*>为主模板偏特化标志;它们格式固定,不会在普通模板中出现
- 调用的时候,如果没有匹配到任何类型,就会使用主模板的默认定义 —— 这点和基类派生类一致
- 全特化指的是特定的一个类型,比如int,float;偏特化反而指的是一类类型,比如指针,const;不要理解错了
适用场景
普通模板要处理的场景为:只有类型不同,实现完全相同的场景;
主模板和全特化要处理的场景是:不同类型的内部实现均不相同,具体到单个类型;
主模板和偏特化要处理的场景是:不同类型的内部实现均不相同,具体到一类类型。
本文来自博客园,作者:moonのsun,转载请注明原文链接:https://www.cnblogs.com/moon-sun-blog/p/19152159

浙公网安备 33010602011771号