快速学习C++中的模板

模板是一个让C++支持范型编程的重要功能,它本质上是一个万能变量适配器;vector,pair等都是使用模板实现的

模板是C++的一个强大特性,它允许您编写通用的代码来处理不同的数据类型。您可以有函数模板和类模板。

  1. 函数模板:

函数模板允许您创建一个函数,该函数可以处理多种数据类型的输入。

template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    std::cout << max(3, 5) << std::endl;     // 对于int类型
    std::cout << max(4.5, 3.5) << std::endl; // 对于double类型
    return 0;
}

在上面的代码中,max函数的返回类型和其参数类型都是由模板参数T决定的。当你使用不同的数据类型调用max时,编译器会为每种数据类型生成一个版本的函数。

  1. 类模板:

类模板允许您定义一个能够处理多种数据类型的类。

template <typename T>
class Box {
private:
    T content;

public:
    Box(T content) : content(content) {}

    T getContent() const {
        return content;
    }
};

int main() {
    Box<int> intBox(42);
    Box<std::string> stringBox("Hello, World!");

    std::cout << intBox.getContent() << std::endl;
    std::cout << stringBox.getContent() << std::endl;
    return 0;
}

上述代码中的Box类有一个成员content,其类型由模板参数T决定。

  1. 模板参数:

您不仅可以使用类型作为模板参数,还可以使用非类型模板参数,例如整数。

template <typename T, int size>
class Array {
private:
    T data[size];

public:
    T& operator[](int index) {
        return data[index];
    }
};

int main() {
    Array<int, 5> myArray;
    myArray[0] = 10;
    std::cout << myArray[0] << std::endl;
    return 0;
}

上述代码定义了一个固定大小的数组类,其中size是非类型模板参数。

  1. 多个模板参数:

您可以为模板提供多个参数,只需用逗号分隔即可。

template <typename T, typename U>
class Pair {
private:
    T first;
    U second;

public:
    Pair(T first, U second) : first(first), second(second) {}

    T getFirst() const {
        return first;
    }

    U getSecond() const {
        return second;
    }
};

int main() {
    Pair<int, std::string> p(42, "Answer");
    std::cout << p.getFirst() << " : " << p.getSecond() << std::endl;
    return 0;
}

在使用模板时,请注意某些模板可能不适用于所有数据类型。当使用模板编程时,确保为所有可能的类型提供了正确的实现。