C++ 模板

在本文中,您将了解 C++ 中的模板。您将学习使用模板的强大功能进行泛型编程。

模板是 C++ 的强大功能,它允许您编写通用程序。简单来说,您可以使用模板创建单个函数或类来处理不同的数据类型。

为了代码的可重用性和程序的灵活性,模板通常用于较大的代码库中。

模板的概念可以以两种不同的方式使用:

  • 函数模板
  • 类模板

函数模板

函数模板的工作方式与普通函数类似,但有一个关键区别。

单个函数模板可以同时处理不同的数据类型,但单个普通函数只能处理一组数据类型。

通常,如果您需要对两种或多种类型的数据执行相同的操作,您可以使用函数重载来创建两个具有所需函数声明的函数。

但是,更好的方法是使用函数模板,因为您可以编写更少且可维护的代码来执行相同的任务。

如何声明函数模板?

函数模板开始从 template 关键字开始,随后跟着 <> 之间的模板参数,再之后是函数声明。

template <typename T>
T functionName(T parameter1, T parameter2, ...) {
    // code
}

在上面的代码中, T 是一个可以接受不同数据类型(int、float)的模板参数,而 typename 是一个关键字。

当将一种数据类型的参数传递给 someFunction( ) 时,编译器会为给定的数据类型生成新版本的 someFunction()

示例 1:查找最大数的函数模板

使用函数模板实现显示两个数字中最大的程序。

#include <iostream>
using namespace std;

// template function
template <class T>
T Large(T n1, T n2)
{
  return (n1 > n2) ? n1 : n2;
}

int main()
{
  int i1, i2;
  float f1, f2;
  char c1, c2;

  cout << "Enter two integers:\n";
  cin >> i1 >> i2;
  cout << Large(i1, i2) <<" is larger." << endl;

  cout << "\nEnter two floating-point numbers:\n";
  cin >> f1 >> f2;
  cout << Large(f1, f2) <<" is larger." << endl;

  cout << "\nEnter two characters:\n";
  cin >> c1 >> c2;
  cout << Large(c1, c2) << " has larger ASCII value.";

  return 0;
}

输出

Enter two integers: 5 10
10 is larger.

Enter two floating-point numbers: 12.4 10.2
12.4 is larger.

Enter two characters: z Z
z has larger ASCII value.

在上面的程序中, Large() 定义了一个接受两个参数 n1n2 的函数模板数据类型 TT 表示该参数可以是任何数据类型。

Large() 函数使用简单的条件操作返回两个参数中最大的一个。

main() 函数内部,声明了三种不同的数据类型的变量: intfloatchar。然后将变量作为普通函数传递给函数模板 Large()

在运行时,当一个整数被传递给模板函数时,编译器知道它必须生成一个 Large() 函数来接受 int 参数。

类似地,当传递浮点数据和字符数据时,它知道参数数据类型并相应地生成 Large() 函数。

这样,仅使用一个函数模板就替换了三个相同的普通函数,并且您的代码可维护性更好。

示例 2:使用函数模板交换数据

使用函数模板交换数据的程序。

#include <iostream>
using namespace std;

template <typename T>
void Swap(T &n1, T &n2)
{
  T temp;
  temp = n1;
  n1 = n2;
  n2 = temp;
}

int main()
{
  int i1 = 1, i2 = 2;
  float f1 = 1.1, f2 = 2.2;
  char c1 = 'a', c2 = 'b';

  cout << "Before passing data to function template.\n";
  cout << "i1 = " << i1 << "\ni2 = " << i2;
  cout << "\nf1 = " << f1 << "\nf2 = " << f2;
  cout << "\nc1 = " << c1 << "\nc2 = " << c2;

  Swap(i1, i2);
  Swap(f1, f2);
  Swap(c1, c2);

        cout << "\n\nAfter passing data to function template.\n";
  cout << "i1 = " << i1 << "\ni2 = " << i2;
  cout << "\nf1 = " << f1 << "\nf2 = " << f2;
  cout << "\nc1 = " << c1 << "\nc2 = " << c2;

  return 0;
}

输出

Before passing data to function template.
i1 = 1 i2 = 2
f1 = 1.1 f2 = 2.2
c1 = a c2 = b

After passing data to function template.
i1 = 2 i2 = 1
f1 = 2.2 f2 = 1.1
c1 = b c2 = a

在这个程序中,不是通过传递值来调用函数,而是通过引用发出调用。

类模板

与函数模板一样,您也可以为通用类操作创建类模板。

如何声明类模板?

template <class T>
class className {
  private:
    T var;
    ... .. ...
  public:
    T functionName(T arg);
    ... .. ...
};

在上面的声明中, T 是模板参数,它是所用数据类型的占位符。

在类体内部,成员变量 var 和成员函数 someOperation() 都是类型 T

如何创建类模板对象?

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

className<dataType> classObject;

例如:

className<int> classObject;
className<float> classObject;
className<string> classObject;

示例 3:使用 Class 模板的简单计算器

使用类模板对两个数字进行加减乘除的程序

#include <iostream>
using namespace std;

template <class T>
class Calculator {
   private:
    T num1, num2;

   public:
    Calculator(T n1, T n2) {
        num1 = n1;
        num2 = n2;
    }

    void displayResult() {
        cout << "Numbers: " << num1 << " and " << num2 << "." << endl;
        cout << num1 << " + " << num2 << " = " << add() << endl;
        cout << num1 << " - " << num2 << " = " << subtract() << endl;
        cout << num1 << " * " << num2 << " = " << multiply() << endl;
        cout << num1 << " / " << num2 << " = " << divide() << endl;
    }

    T add() { return num1 + num2; }
    T subtract() { return num1 - num2; }
    T multiply() { return num1 * num2; }
    T divide() { return num1 / num2; }
};

int main() {
    Calculator<int> intCalc(2, 1);
    Calculator<float> floatCalc(2.4, 1.2);

    cout << "Int results:" << endl;
    intCalc.displayResult();

    cout << endl
         << "Float results:" << endl;
    floatCalc.displayResult();

    return 0;
}

输出

Int results:
Numbers: 2 and 1.
2 + 1 = 3
2 - 1 = 1
2 * 1 = 2
2 / 1 = 2

Float results:
Numbers: 2.4 and 1.2.
2.4 + 1.2 = 3.6
2.4 - 1.2 = 1.2
2.4 * 1.2 = 2.88
2.4 / 1.2 = 2

在上面的程序中, 声明了一个类模板 Calculator

该类包含两个类型为 T 的私有成员: num1num2,以及一个用于初始化成员的构造函数。

它还包含公共成员函数,用于计算数字的加、减、乘和除,返回用户定义的数据类型的值。同样, displayResult() 将最终输出显示到屏幕上的函数。

main() 函数,两个不同的 Calculator 对象 intCalcfloatCalc 分别针对数据类型 intfloat 创建。这些值是使用构造函数初始化的。

请注意,我们在创建对象时使用了 <int><float> 。这些告诉编译器用于创建类的数据类型。

这将为 intfloat 分别创建一个类定义,然后相应地使用它们。

然后,调用两个对象的 displayResult() 函数,它执行计算器操作并显示输出。