第13课: 模板编程
函数模板
#include <iostream>
using namespace std;
// 函数模板
template <typename T>
T getMax(T a, T b) {
return (a > b) ? a : b;
}
// 多个类型参数
template <typename T1, typename T2>
void display(T1 a, T2 b) {
cout << "a = " << a << ", b = " << b << endl;
}
int main() {
// 自动推导类型
cout << "最大值:" << getMax(10, 20) << endl;
cout << "最大值:" << getMax(3.14, 2.71) << endl;
cout << "最大值:" << getMax('a', 'z') << endl;
// 显式指定类型
cout << "最大值:" << getMax<double>(10, 20.5) << endl;
display(100, 3.14);
display("Hello", 42);
return 0;
}
类模板
#include <iostream>
using namespace std;
// 类模板
template <typename T>
class Array {
private:
T *data;
int size;
public:
Array(int s) : size(s) {
data = new T[size];
}
~Array() {
delete[] data;
}
void set(int index, T value) {
if (index >= 0 && index < size) {
data[index] = value;
}
}
T get(int index) {
if (index >= 0 && index < size) {
return data[index];
}
return T();
}
int getSize() const {
return size;
}
};
int main() {
// 整型数组
Array<int> intArr(5);
for (int i = 0; i < intArr.getSize(); i++) {
intArr.set(i, i * 10);
}
for (int i = 0; i < intArr.getSize(); i++) {
cout << intArr.get(i) << " ";
}
cout << endl;
// 字符串数组
Array<string> strArr(3);
strArr.set(0, "Hello");
strArr.set(1, "World");
strArr.set(2, "C++");
for (int i = 0; i < strArr.getSize(); i++) {
cout << strArr.get(i) << " ";
}
cout << endl;
return 0;
}
模板特化
#include <iostream>
#include <cstring>
using namespace std;
// 通用模板
template <typename T>
class Storage {
private:
T data;
public:
Storage(T d) : data(d) {}
void display() {
cout << "数据:" << data << endl;
}
};
// 模板特化:针对char*类型
template <>
class Storage<char*> {
private:
char *data;
public:
Storage(char *d) {
data = new char[strlen(d) + 1];
strcpy(data, d);
}
~Storage() {
delete[] data;
}
void display() {
cout << "字符串:" << data << endl;
}
};
int main() {
Storage<int> s1(100);
s1.display();
Storage<double> s2(3.14);
s2.display();
char str[] = "Hello";
Storage<char*> s3(str);
s3.display();
return 0;
}
模板与继承
#include <iostream>
using namespace std;
// 模板基类
template <typename T>
class Container {
protected:
T value;
public:
Container(T v) : value(v) {}
virtual void display() {
cout << "值:" << value << endl;
}
};
// 派生类继承模板类
template <typename T>
class Box : public Container<T> {
public:
Box(T v) : Container<T>(v) {}
void display() override {
cout << "盒子中的值:" << this->value << endl;
}
};
int main() {
Box<int> box1(100);
box1.display();
Box<string> box2("Hello");
box2.display();
return 0;
}
可变参数模板(C++11)
#include <iostream>
using namespace std;
// 递归终止函数
void print() {
cout << endl;
}
// 可变参数模板
template <typename T, typename... Args>
void print(T first, Args... args) {
cout << first << " ";
print(args...); // 递归调用
}
// 计算参数个数
template <typename... Args>
int count(Args... args) {
return sizeof...(args);
}
int main() {
print(1, 2, 3, 4, 5);
print("Hello", "World", 100, 3.14);
cout << "参数个数:" << count(1, 2, 3, 4, 5) << endl;
return 0;
}
模板默认参数
#include <iostream>
using namespace std;
// 模板默认参数
template <typename T = int, int SIZE = 10>
class Array {
private:
T data[SIZE];
public:
void set(int index, T value) {
if (index >= 0 && index < SIZE) {
data[index] = value;
}
}
T get(int index) {
if (index >= 0 && index < SIZE) {
return data[index];
}
return T();
}
int getSize() const {
return SIZE;
}
};
int main() {
Array<> arr1; // 使用默认参数:int, 10
Array<double> arr2; // double, 10
Array<char, 5> arr3; // char, 5
cout << "arr1大小:" << arr1.getSize() << endl;
cout << "arr2大小:" << arr2.getSize() << endl;
cout << "arr3大小:" << arr3.getSize() << endl;
return 0;
}
练习题
- 实现一个通用的swap函数模板
- 创建一个栈类模板,支持push、pop、top操作
- 实现一个Pair类模板,存储两个不同类型的值
- 编写一个通用的排序函数模板