📅  最后修改于: 2023-12-03 14:39:54.126000             🧑  作者: Mango
在C++中,模板是一种代码重用机制,允许用户编写具有通用性的代码。模板使得程序员可以编写一次代码来工作于多种不同的数据类型,而不必编写类似的代码多次。
模板的定义以关键字template
开始,后跟模板参数列表和模板体。模板参数列表是一组以逗号分隔的模板参数,用于指定模板化的类型或值。模板体包含一个或多个使用形参类型与模板参数定义的函数或类。
下面是一个使用函数模板解决两个数相加的例子:
template<typename T>
T add(T a, T b)
{
return a + b;
}
在上面的例子中,定义了一个名为add
的函数模板,其中使用了一个名为T
的类型参数。该函数的参数和返回值类型都为T
类型,这意味着函数可以对任意类型进行通用性操作。例如:
int main()
{
int a = 1, b = 2;
double c = 1.5, d = 3.7;
cout << add(a, b) << endl; // 输出 3
cout << add(c, d) << endl; // 输出 5.2
return 0;
}
在上面的示例中,我们传递了不同的参数类型,但是函数模板仍然工作正常。
下面是一个使用类模板创建动态数组的例子:
template<typename T>
class DynamicArray
{
private:
T* data;
int size;
public:
DynamicArray(int s);
~DynamicArray();
void set(int index, T value);
T get(int index);
};
template<typename T>
DynamicArray<T>::DynamicArray(int s)
{
size = s;
data = new T[size];
}
template<typename T>
DynamicArray<T>::~DynamicArray()
{
delete[] data;
}
template<typename T>
void DynamicArray<T>::set(int index, T value)
{
data[index] = value;
}
template<typename T>
T DynamicArray<T>::get(int index)
{
return data[index];
}
在上面的代码中,我们定义了一个名为DynamicArray
的类模板。该模板使用了一个名为T
的类型参数,它表示数据的类型。我们在DynamicArray
类中定义了一些函数来设置和获取数据,以及在构造函数中分配内存。
下面是我们如何使用DynamicArray
模板创建两个不同的数组:
int main()
{
DynamicArray<int> arr1(10);
DynamicArray<double> arr2(5);
for (int i = 0; i < 10; i++)
{
arr1.set(i, i);
}
for (int i = 0; i < 5; i++)
{
arr2.set(i, i + 0.5);
}
for (int i = 0; i < 10; i++)
{
cout << arr1.get(i) << " ";
}
cout << endl;
for (int i = 0; i < 5; i++)
{
cout << arr2.get(i) << " ";
}
cout << endl;
return 0;
}
在上面的示例中,我们创建了两个不同的DynamicArray
对象,一个用于整数,另一个用于双精度浮点数。对于每个数组,我们循环设置值,最后循环打印出它们的值。
模板特化是指将通用的模板代码针对特定的类型进行优化。在下面的示例中,我们将上面的DynamicArray
模板特化为char
类型:
template<>
class DynamicArray<char>
{
private:
char* data;
int size;
public:
DynamicArray(int s);
~DynamicArray();
void set(int index, char value);
char get(int index);
};
DynamicArray<char>::DynamicArray(int s)
{
size = s;
data = new char[size];
}
DynamicArray<char>::~DynamicArray()
{
delete[] data;
}
void DynamicArray<char>::set(int index, char value)
{
data[index] = value;
}
char DynamicArray<char>::get(int index)
{
return data[index];
}
在上面的代码中,我们创建了一个特化版本的DynamicArray
模板,并将它所有使用的T
类型特化为char
类型。在这个特化版本中,我们分配的内存及数据类型都为char
类型。
模板是C++中非常重要的机制,使得我们可以将代码通用化,减少代码冗余。在实际编程中,我们可以使用类、函数及类成员函数模板来创建通用性代码,并通过模板特化实现针对特定类型的代码优化。