📜  C++模板(1)

📅  最后修改于: 2023-12-03 15:29:55.333000             🧑  作者: Mango

C++模板

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 类是一个接受两种相同类型的参数 xy 的类。可以调用 AddSubtractMultiplyDivide 成员函数,以执行相应的算术操作。该类的定义中包含一个 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 接收两个整数参数,并调用其 AddSubtract 成员函数。而 Calculator<double> 对象 doubleCalc 接受两个双精度浮点数参数,并调用其 MultiplyDivide 成员函数。

函数模板

函数模板是定义函数时使用的一种模板方式。函数模板的语法遵循与类模板相同的模式,只是模板参数列表通常位于函数名称和输入参数列表的中间。

以下是一个函数模板的例子:

template <typename T>
T max(T a, T b) {
    return a > b ? a : b;
}

在该示例中,max 函数接受两种相同类型的参数 ab。可以使用该函数来比较任意类型的值,并返回这些值之间的较大者。

可以这样使用该函数:

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++模板是一项功能强大的特性,可以让程序员更轻松地编写通用代码。通过使用类模板和函数模板,可以使代码更具可重用性,同时通过使用模板特化,可以在需要时为特定类型提供特殊实现。