📅  最后修改于: 2023-12-03 15:29:42.514000             🧑  作者: Mango
在 C++ 中,模板可以被用来创建泛型数据类型和函数。在实际开发中,使用模板可以大大提高代码的重用性和灵活性。
在此问题中,我们将讨论 C++ 中的函数模板和类模板。
函数模板是一种通用函数的定义,其参数类型不是特定的数据类型。通过函数模板,我们可以定义一种可以处理任意数据类型的通用函数,并且可以在实际调用时传递具体的数据类型。
函数模板的语法如下:
template<typename T>
T add(T a, T b) {
return a + b;
}
在上面的代码中,add
是一个接受两个参数并返回它们的和的通用函数模板。使用 typename
关键字表示模板参数类型。
下面是使用函数模板的示例:
int main() {
int a = 5, b = 10;
double c = 1.5, d = 2.5;
std::cout << add<int>(a, b) << std::endl; // 输出 15
std::cout << add<double>(c, d) << std::endl; // 输出 4
return 0;
}
在上面的示例中,我们可以看到 add
函数模板被调用两次,分别传递整型和双精度浮点数类型参数。
类模板是一种通用类的定义,其数据成员和成员函数的数据类型不是特定的数据类型。通过类模板,我们可以定义一种可以处理任意数据类型的通用类,并且可以在构造对象时传递具体的数据类型。
类模板的语法如下:
template<typename T>
class Vector {
public:
Vector() : size(0), capacity(INITIAL_CAPACITY), data(new T[INITIAL_CAPACITY]) {}
void push_back(T element) {
if (size == capacity) {
resize();
}
data[size++] = element;
}
T& operator[](int index) {
return data[index];
}
int size() const {
return size;
}
~Vector() {
delete[] data;
}
private:
int size;
int capacity;
T* data;
static const int INITIAL_CAPACITY = 2;
void resize() {
T* newData = new T[capacity * 2];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
delete[] data;
data = newData;
capacity *= 2;
}
};
在上面的代码中,Vector
是一个将数据存储在动态数组中的通用类模板。使用 typename
关键字表示模板参数类型。
下面是使用类模板的示例:
int main() {
Vector<int> myIntVector;
myIntVector.push_back(1);
myIntVector.push_back(2);
myIntVector.push_back(3);
for (int i = 0; i < myIntVector.size(); i++) {
std::cout << myIntVector[i] << std::endl;
}
Vector<double> myDoubleVector;
myDoubleVector.push_back(1.5);
myDoubleVector.push_back(2.5);
myDoubleVector.push_back(3.5);
for (int i = 0; i < myDoubleVector.size(); i++) {
std::cout << myDoubleVector[i] << std::endl;
}
return 0;
}
在上面的示例中,我们可以看到 Vector
类模板被实例化两次,分别传递整型和双精度浮点数类型参数。
通过函数模板和类模板,我们可以创建通用代码并处理任意数据类型。它们是 C++ 中重要的工具,可以提高代码的重用性和灵活性。