0. 什么是模板
C++中的模板(template),是泛型编程的基础。一个模板就是一个蓝图,用来创建类或函数的蓝图。
模板主要分为两类:
- 函数模板(function template)
- 类模板(class template)
在了解了类模板之后,我们不难发现,不论是在普通的类(不是模板类)或者模板类中,都可以定义新的模板函数,这就是本文的主题:成员模板(member template)。
关于模板的全部内容,参考【C++深陷】之“模板”。
关于成员模板,主要分为两方面:
- 普通类的成员模板
- 类模板的成员模板
1. 普通类的成员模板
class DebugDelete {
public:
// 构造函数
DebugDelete(std::ostream &s = std::cerr): os(s) {}
// 一个成员模板
// T的类型由编译器推断
template <typename T>
void operator()(T *p) const {
os << "deleting ptr" << std::endl;
delete p;
}
};
定义一个成员模板,以template开头,后接模板参数列表。
使用成员模板:
double *p = new double(2.0);
DebugDelete d;
d(p); // 编译器自动推断
2. 类模板的成员模板
对于类模板,也可以定义成员模板:
template <typename T> class Blob {
public:
template <typename It> Blob(It b, It e);
// ...
};
该类模板的构造函数,有自己的模板参数列表,因此是一个成员模板。
在类外定义类模板的成员模板时,需要包括两个模板参数列表:
template <typename T>
template <typename It>
Blob<T>::Blob(It b, It e) {
// ...
}
使用类模板的成员模板时,编译器依旧根据提供的参数进行模板实参推断:
int ia[] = {0, 1, 2, 3, 4};
Blob<int> a1(begin(ia), end(ia));

431

被折叠的 条评论
为什么被折叠?



