<返回目录     Powered by claude/xia兄

第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;
}

练习题

  1. 实现一个通用的swap函数模板
  2. 创建一个栈类模板,支持push、pop、top操作
  3. 实现一个Pair类模板,存储两个不同类型的值
  4. 编写一个通用的排序函数模板