day16_模板.md
模板
- 泛型,是一种将类型参数化以达到代码复用的技术,C++中使用模板来实现泛型
- 模板的使用格式如下
- template <typename\class T>
- typename和class是等价的
- 模板没有被使用时,是不会被实例化出来的
- 模板的声明和实现如果分离到.h和.cpp中,会导致链接错误
- 一般将模板的声明和实现统一放到一个.hpp文件中
函数模板
template <class T> void swapValues(T &v1, T &v2);
template <class T>
void swapValues(T &v1, T &v2) {
T tmp = v1;
v1 = v2;
v2 = tmp;
}
多参数模板
template <class T> void swapValues(T &v1, T &v2) {
T tmp = v1;
v1 = v2;
v2 = tmp;
}
类模板
#include <iostream>
using namespace std;
template <class Item>
class Array {
friend ostream &operator<<<>(ostream &, const Array<Item> &);
int m_size = 0;
int m_capacity = 0;
Item *m_data = NULL;
public:
Array(int capacity);
~Array();
void add(Item value);
Item get(int index);
int size();
Item operator[](int index);
void display();
};
template <class Item>
Array<Item>::Array(int capacity) {
if (capacity <= 0) return;
this->m_data = new Item[capacity]{};
this->m_capacity = capacity;
}
template <class Item>
Array<Item>::~Array() {
if (!this->m_data) return;
delete[] this->m_data;
this->m_data = NULL;
}
template <class Item>
void Array<Item>::add(Item value) {
if (this->m_size == this->m_capacity) {
// 扩容
cout << "数组已满" << endl;
return;
}
this->m_data[this->m_size++] = value;
}
template <class Item>
Item Array<Item>::get(int index) {
if (index < 0 || index >= this->m_size) return 0;
return this->m_data[index];
}
template <class Item>
int Array<Item>::size() {
return this->m_size;
}
template <class Item>
Item Array<Item>::operator[](int index) {
return get(index);
}
template <class Item>
void Array<Item>::display() {
cout << "[";
for (int i = 0; i < this->m_size; i++) {
cout << this->m_data[i];
if (i != this->m_size - 1) {
cout << ", ";
}
}
cout << "]" << endl;
}
template <class Item>
ostream &operator<<<>(ostream &cout, const Array<Item> &array) {
cout << "[";
for (int i = 0; i < array.m_size; i++) {
cout << array.m_data[i];
if (i != array.m_size - 1) {
cout << ", ";
}
}
return cout << "]";
}
#include <iostream>
#include "Array.hpp"
using namespace std;
//template <class Item>
//class Array {
// // friend ostream &operator<<(ostream &, const Array &);
// int m_size = 0;
// int m_capacity = 0;
// Item *m_data = NULL;
//public:
// Array(int capacity) {
// if (capacity <= 0) return;
//
// this->m_data = new Item[capacity] {};
// this->m_capacity = capacity;
// }
//
// ~Array() {
// if (!this->m_data) return;
//
// delete[] this->m_data;
// this->m_data = NULL;
// }
//
// void add(Item value) {
// if (this->m_size == this->m_capacity) {
// // 扩容
// cout << "数组已满" << endl;
// return;
// }
// this->m_data[this->m_size++] = value;
// }
//
// Item get(int index) {
// if (index < 0 || index >= this->m_size) return 0;
// return this->m_data[index];
// }
//
// int size() {
// return this->m_size;
// }
//
// Item operator[](int index) {
// return get(index);
// }
//
// void display() {
// cout << "[";
// for (int i = 0; i < this->m_size; i++) {
// cout << this->m_data[i];
// if (i != this->m_size - 1) {
// cout << ", ";
// }
// }
// cout << "]" << endl;
// }
//};
//ostream &operator<<(ostream &cout, const Array &array) {
// cout << "[";
// for (int i = 0; i < array.m_size; i++) {
// cout << array.m_data[i];
// if (i != array.m_size - 1) {
// cout << ", ";
// }
// }
// return cout << "]";
//}
class Person {
friend ostream &operator<<(ostream &, const Person &);
int m_age;
public:
Person(int age = 0) :m_age(age) { }
};
ostream &operator<<(ostream &cout, const Person &person) {
return cout << "age=" << person.m_age;
}
int main() {
/*Array<Person *> array(3);
array.add(new Person(11));
array.add(new Person(12));
array.add(new Person(13));
array.display();*/
Array<Person> array(3);
array.add(Person(11));
array.add(Person(12));
array.add(Person(13));
// array.display();
cout << array << endl;
/*Array<int> array(5);
array.add(11);
array.add(22);
array.add(33);
array.add(44);
array.add(55);
array.display();
Array<double> array2(3);
array2.add(10.8);
array2.add(10.9);
array2.add(10.4);
array2.display();*/
// cout << array << endl;
/*Array array;
array.add(10);
array.add(20);
array.add(11);
array.add(22);
array.get(2);
array[2];
array.size() == 4;
array.remove(3);
array.insert(1, 30);*/
getchar();
return 0;
}
类模板中的友元函数
template <class Item>
class Array {
friend ostream &operator<<<>(ostream &, const Array<Item> &);
int m_size = 0;
int m_capacity = 0;
Item *m_data = NULL;
public:
Array(int capacity);
~Array();
void add(Item value);
Item get(int index);
int size();
Item operator[](int index);
void display();
};
template <class Item>
ostream &operator<<<>(ostream &cout, const Array<Item> &array) {
cout << "[";
for (int i = 0; i < array.m_size; i++) {
cout << array.m_data[i];
if (i != array.m_size - 1) {
cout << ", ";
}
}
return cout << "]";
}