C++模板是一种泛型编程的工具,它允许编写通用的代码来处理不同类型的数据。通过使用模板,可以实现代码的复用和类型的参数化。
模板可以分为函数模板和类模板两种形式:
函数模板:函数模板是一种用于定义通用函数的机制。通过函数模板,可以编写可以接受不同类型参数的函数。函数模板使用关键字template
来声明,并使用一个或多个类型参数来指定通用的参数类型。
函数模板以关键字template开头,其后是<>内的模板参数,然后是函数声明。
template
T someFunction(T arg)
{
... .. ...
}
在上面的代码中,T是一个模板参数,它接受不同的数据类型(如int,float等),而class是关键字。在上面的示例中,您还可以使用关键字typename代替class。当将数据类型的参数传递给someFunction()时,编译器会为给定数据类型生成someFunction()的新版本。
下面是一个简单的函数模板示例,用于交换两个值:
template
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
在上述代码中,typename T
指定了一个类型参数T
,在函数体中可以使用T
作为通用的类型来进行操作。
应用:
通过使用模板,完成对int类型数据、char类型数据各自的交换。
#include
template
void swap(T& a, T& b) {
T temp = a;
a = b;
b = temp;
}
int main() {
// int类型数据交换
int a = 1, b = 2;
std::cout << "int类型数据交换:\n";
std::cout << "没有交换前a、b的值分别为:" << a << ";" << b << std::endl;
swap(a, b); // 实例化并调用函数模板
std::cout << "交换后a、b的值分别为:" << a <<";" << b << std::endl;
// char类型数据交换
char str1 = 'A';
char str2 = 'B';
std::cout << "char类型数据交换:\n";
std::cout << "没有交换前str1、str2的值分别为:" << str1 << ";" << str2 << std::endl;
swap(str1, str2); // 实例化并调用函数模板
std::cout << "交换后str1、str2的值分别为:" << str1 << ";" << str2 << std::endl;
return 0;
}
输出结果:
与函数模板一样,您也可以为通用类操作创建类模板。有时,您需要一个适用于所有类的类实现,只是所使用的数据类型不同。通常,您需要为每种数据类型创建一个不同的类,或者在一个类中创建不同的成员变量和函数。这将会增加很类似的代码,并且将难以维护。但是,类模板使对所有数据类型重复使用相同的代码变得更容易。
template
class className
{
... .. ...
public:
T var;
T someOperation(T arg);
... .. ...
};
在上面的声明中,T是模板参数,它是所使用数据类型的占位符。在类内部,成员变量var和成员函数someOperation()均为T类型。
要创建类模板对象,需要在创建时在< >中定义数据类型。
classNameclassObject;
例如:
classNameclassObject; className classObject; className classObject;
程序使用类模板对两个数字进行加,减,乘和除运算。
#include
template
class Calculator{
private:
T num1, num2;
public:
Calculator(T n1, T n2) {
num1 = n1;
num2 = n2;
}
void display() {
std::cout << "Numbers are:" << num1 << "and" << num2 << "." << std::endl;
std::cout << "Addition is:" << add() << std::endl;
std::cout << "Subtraction is:" << subtract() << std::endl;
std::cout << "Product is:" << multiply() << std::endl;
std::cout << "Division is:" << divide() << std::endl;
}
T add() { return num1 + num2; }
T subtract() { return num1 - num2; }
T multiply() { return num1 * num2; }
T divide() { return num1 / num2; }
};
int main() {
Calculator intCalc(2, 1);
CalculatorfloatCalc(2.4, 1.2);
std::cout << "Int results:" << std::endl;
intCalc.display();
std::cout << "Float results:" << std::endl;
floatCalc.display();
}
输出结果:
在上面的程序中,声明了一个类模板Calculator。该类包含两个类型为T的私有成员:num1和num2,以及用于初始化成员的构造函数。它还包含公共成员函数,用于计算数字的加,减,乘和除,以返回用户定义的数据类型的值。 同样,函数display()将最终结果输出显示到屏幕上。在main()函数中,分别为数据类型创建了两个不同的Calculator对象intCalc和floatCalc:int和float。 使用构造函数初始化值。注意,我们在创建对象时使用
使用模板的优点:
使用模板可以大大提高代码的灵活性和可重用性,使得在处理不同类型数据时更加方便。需要注意的是,在使用模板时,编译器会根据实际使用的类型生成对应的代码,因此模板代码会在编译期间进行实例化和生成。