📅  最后修改于: 2023-12-03 15:29:55.333000             🧑  作者: Mango
C++模板是C++语言的一个高级特性,它允许程序员编写通用的类或函数,可以与多个数据类型一起使用。通过使用模板,可以将数据类型与算法分离,使代码更具可重用性,同时也有助于减少代码维护的工作量。
类模板是定义类时使用的一种模板方式。在类模板中,在类名称后面加上<>定义一个模板参数列表,其中可以包含一个或多个类型参数。通过使用这些类型参数,可以在类中使用不定数量的数据类型。
以下是一个简单的类模板的例子:
template <typename T>
class Calculator {
public:
Calculator(T x, T y) : x_(x), y_(y) {}
T Add() const { return x_ + y_; }
T Subtract() const { return x_ - y_; }
T Multiply() const { return x_ * y_; }
T Divide() const { return x_ / y_; }
private:
T x_;
T y_;
};
在该示例中,Calculator
类是一个接受两种相同类型的参数 x
和 y
的类。可以调用 Add
、Subtract
、Multiply
和 Divide
成员函数,以执行相应的算术操作。该类的定义中包含一个 template
声明,该声明指定类型参数 T
。
在使用类模板时,必须在模板名称后面指定模板参数列表的实际类型。例如,可以这样使用 Calculator
类:
Calculator<int> intCalc(2, 3);
cout << intCalc.Add() << endl;
cout << intCalc.Subtract() << endl;
Calculator<double> doubleCalc(2.5, 3.5);
cout << doubleCalc.Multiply() << endl;
cout << doubleCalc.Divide() << endl;
在这个示例中,Calculator<int>
对象 intCalc
接收两个整数参数,并调用其 Add
和 Subtract
成员函数。而 Calculator<double>
对象 doubleCalc
接受两个双精度浮点数参数,并调用其 Multiply
和 Divide
成员函数。
函数模板是定义函数时使用的一种模板方式。函数模板的语法遵循与类模板相同的模式,只是模板参数列表通常位于函数名称和输入参数列表的中间。
以下是一个函数模板的例子:
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
在该示例中,max
函数接受两种相同类型的参数 a
和 b
。可以使用该函数来比较任意类型的值,并返回这些值之间的较大者。
可以这样使用该函数:
int a = 10, b = 20;
cout << max(a, b) << endl; // 输出 20
double x = 3.5, y = 7.2;
cout << max(x, y) << endl; // 输出 7.2
string s1 = "hello", s2 = "world";
cout << max(s1, s2) << endl; // 输出 world
在使用函数模板时,与类模板相同,必须在函数名称后面指定要使用的类型。尖括号 <>
内包含要使用的实际类型。在调用函数时,可以像调用常规函数一样传递参数。
在某些情况下,当所有模板实例都不适合某种数据类型时,可以使用模板特化来提供针对特定类型的特殊实现。
以下是一个模板特化的例子:
template <typename T>
class Printer {
public:
void Print(T value) const {
cout << "Generic: " << value << endl;
}
};
template<>
class Printer<string> {
public:
void Print(string value) const {
cout << "Specialized: " << value << endl;
}
};
在该示例中,Printer
类模板定义了一个 Print
函数,它接受值并将其打印出来。Printer<string>
类模板用于特化 Print
函数,以便为 string
类型提供特殊实现。
可以这样使用这两个类模板:
Printer<int> intPrinter;
intPrinter.Print(42); // 输出 Generic: 42
Printer<string> stringPrinter;
stringPrinter.Print("hello"); // 输出 Specialized: hello
在这个示例中,Printer<int>
对象 intPrinter
调用其 Print
函数,该函数以 int
类型的值 42
作为参数。而 Printer<string>
对象 stringPrinter
也调用其 Print
函数,该函数以 string
类型的值 "hello"
为参数。
C++模板是一项功能强大的特性,可以让程序员更轻松地编写通用代码。通过使用类模板和函数模板,可以使代码更具可重用性,同时通过使用模板特化,可以在需要时为特定类型提供特殊实现。