CppPrimer笔记 Chapter16 模板与泛型编程
标签: Cpp
定义模板(16.1)
- 定义函数模板(为什么以下调用了函数版本二?)
using namespace std;
template <typename T>
int compare(const T&v1, const T&v2)
{
cout << "compare1";
if (v1 < v2){
return -1;}
if (v2 < v1){
return 1;}
return 0;
}
template<unsigned N, unsigned M>
int compare(const char(&p1)[N], const char(&p2)[M])
{
cout << "compare2";
return strcmp(p1, p2);
}
template <typename T,typename M>
int compare(const T&v1, const M&v2)
{
cout << "compare3";
if (v1 < v2){
return -1;}
if (v2 < v1){
return 1;}
return 0;
}
int main()
{
cout<<compare("mom2", "mom");
}
- 非类型模板参数的模板实参必须是常量表达式
- 函数模板与类模板成员函数定义通常放在头文件中(调用一个普通函数时,编译器只需要掌握函数的声明.而必须掌握函数模板或类模板成员的定义)
- 一个类模板的每个示例都形成一个独立的类.之间为各自独立的类
- 在类模板自己的作用域中我们可以直接使用模板名而不提供实参.
- 在类模板外使用类模板名
- 类模板与友元
有三种关系:(代码中给出例子与详细解释)
- 建立对应实例及其友元间的友好关系
- 将另一个模板的每一个实例都声明为自己的友元
- 限定特定的实例为友元
- 令模板自己的类型参数成为友元
**建立对应实例及其友元间的友好关系
即BlobPtr只能是Blob的友元,而不是Blob的友元,对于==来说也是这样**
template <typename> class BlobPtr;
template <typename> class Blob;//运算符==中的参数所需要的
template <typename T>
bool operator==(const Blob<T>&, const Blob<T>&);
template <typename T> class Blob
{
//每个Blob实例将访问权限授予用相同类型实例化的BlobPtr和相等运算符
friend class BlobPtr<T>;
friend bool operator==<T>(const Blob<T>&, const Blob<T>&);
};
一个类将限定特定的实例为友元,如下 只有Pal是 C的友元,Pal就不是
template <typename T>class Pal;
class C//C是一个普通的非模板类
{
friend class Pal<C>;//用类C实例化的Pal是C的一个友元
//Pal的所有实例都是C的友元
template <typename T> friend class Pal2;
};
**将另一个模板的每一个示例都声明为自己的友元
即Pal可以访问C,C2的所有实例,比如C C C2
此时 友元声明中必须使用与类模板本身不同的模板参数,见代码L7**
template <typename T> class C2//C2本身是一个类模板
{