模板是一个让C++支持范型编程的重要功能,它本质上是一个万能变量适配器;vector,pair等都是使用模板实现的
模板是C++的一个强大特性,它允许您编写通用的代码来处理不同的数据类型。您可以有函数模板和类模板。
函数模板允许您创建一个函数,该函数可以处理多种数据类型的输入。
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
时,编译器会为每种数据类型生成一个版本的函数。
类模板允许您定义一个能够处理多种数据类型的类。
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
决定。
您不仅可以使用类型作为模板参数,还可以使用非类型模板参数,例如整数。
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
是非类型模板参数。
您可以为模板提供多个参数,只需用逗号分隔即可。
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;
}
在使用模板时,请注意某些模板可能不适用于所有数据类型。当使用模板编程时,确保为所有可能的类型提供了正确的实现。