C++模板

        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;


}

输出结果: 

C++模板_第1张图片

 类模板

        与函数模板一样,您也可以为通用类操作创建类模板。有时,您需要一个适用于所有类的类实现,只是所使用的数据类型不同。通常,您需要为每种数据类型创建一个不同的类,或者在一个类中创建不同的成员变量和函数。这将会增加很类似的代码,并且将难以维护。但是,类模板使对所有数据类型重复使用相同的代码变得更容易。

如何声明一个类模板?

template 
class className
{
   ... .. ...
public:
   T var;
   T someOperation(T arg);
   ... .. ...
};

        在上面的声明中,T是模板参数,它是所使用数据类型的占位符。在类内部,成员变量var和成员函数someOperation()均为T类型。 

如何创建类模板对象?

要创建类模板对象,需要在创建时在< >中定义数据类型。

className classObject;

例如:

className classObject;
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();

}

输出结果: 

 C++模板_第2张图片

        在上面的程序中,声明了一个类模板Calculator。该类包含两个类型为T的私有成员:num1和num2,以及用于初始化成员的构造函数。它还包含公共成员函数,用于计算数字的加,减,乘和除,以返回用户定义的数据类型的值。 同样,函数display()将最终结果输出显示到屏幕上。在main()函数中,分别为数据类型创建了两个不同的Calculator对象intCalc和floatCalc:int和float。 使用构造函数初始化值。注意,我们在创建对象时使用。这些告诉编译器用于类创建的数据类型。这将为int和float分别创建一个类定义,然后相应地使用它们。然后,display()两个对象都被调用,然后,调用这两个对象的display(),它执行计算器操作并显示输出。

总结

使用模板的优点:

        使用模板可以大大提高代码的灵活性和可重用性,使得在处理不同类型数据时更加方便。需要注意的是,在使用模板时,编译器会根据实际使用的类型生成对应的代码,因此模板代码会在编译期间进行实例化和生成。

你可能感兴趣的:(C++,c++,开发语言)