模板是一个让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;
}
在使用模板时,请注意某些模板可能不适用于所有数据类型。当使用模板编程时,确保为所有可能的类型提供了正确的实现。