在C++中,模板(Templates)是实现泛型编程的核心机制。它允许你编写与类型无关的代码,从而提高代码的复用性和灵活性。C++中的模板主要分为三种:模板函数、模板类和模板变量(C++14引入)。下面分别进行详细介绍。
1. 模板函数(Function Templates)
模板函数允许你编写一个函数,使其可以处理多种数据类型,而无需为每种类型重复编写代码。
基本语法:
template <typename T>
返回类型 函数名(参数列表) {
// 函数体
}
或使用 class 关键字(与 typename 等价):
template <class T>
...
示例:
#include <iostream>
using namespace std;
// 定义一个模板函数,返回两个值中的较大者
template <typename T>
T max(T a, T b) {
return (a > b) ? a : b;
}
int main() {
cout << max(3, 5) << endl; // 调用 max<int>
cout << max(3.14, 2.71) << endl; // 调用 max<double>
cout << max('a', 'z') << endl; // 调用 max<char>
return 0;
}
注意事项:
编译器会根据调用时的参数类型自动推导模板参数(类型推导)。
也可以显式指定模板参数:max<int>(3, 5)。
模板函数在编译时实例化,生成对应类型的函数。
2. 模板类(Class Templates)
模板类允许你定义一个通用的类,其数据成员和成员函数可以使用一个或多个未指定的类型。
基本语法:
template <typename T1, typename T2, ...>
class 类名 {
// 类定义
};
示例:
#include <iostream>
using namespace std;
// 定义一个简单的模板类,表示一个包含两个值的对
template <typename T>
class Pair {
private:
T first, second;
public:
Pair(T a, T b) : first(a), second(b) {}
void display() const {
cout << "(" << first << ", " << second << ")" << endl;
}
T getSum() const {
return first + second;
}
};
int main() {
Pair<int> p1(10, 20);
p1.display(); // 输出: (10, 20)
cout << "Sum: " << p1.getSum() << endl; // 输出: 30
Pair<double> p2(3.14, 2.86);
p2.display(); // 输出: (3.14, 2.86)
return 0;
}
多模板参数示例:
template <typename T, typename U>
class KeyValuePair {
T key;
U value;
public:
KeyValuePair(T k, U v) : key(k), value(v) {}
void print() const { cout << key << ": " << value << endl; }
};
成员函数模板:
类内部也可以定义模板成员函数:
class MyClass {
public:
template<typename T>
void print(T value) {
cout << value << endl;
}
};
3. 模板变量(Variable Templates) - C++14 引入
C++14引入了变量模板,允许你定义一个模板化的变量,通常用于定义与类型相关的常量。
基本语法:
template <typename T>
constexpr 类型 变量名 = 值;
示例:
#include <iostream>
#include <limits>
using namespace std;
// 定义一个模板变量,表示某种类型的“最大值”
template <typename T>
constexpr T max_value = numeric_limits<T>::max();
// 定义一个通用的pi值,根据类型选择精度
template <typename T>
constexpr T pi = T(3.1415926535897932385L);
int main() {
cout << "int max: " << max_value<int> << endl;
cout << "double pi: " << pi<double> << endl;
cout << "float pi: " << pi<float> << endl;
return 0;
}
优势:
避免了为每种类型单独定义常量。
提高了代码的可维护性和一致性。
常用于数学库、类型特征(type traits)等场景。
总结对比
高级特性(简要提及)
模板特化(Specialization):为特定类型提供定制实现。
偏特化(Partial Specialization):仅对部分模板参数进行特化(仅适用于类模板)。
可变参数模板(Variadic Templates):支持任意数量的模板参数(C++11)。
概念(Concepts):C++20引入,用于约束模板参数类型,提高错误信息可读性。
模板是C++强大类型系统和泛型能力的体现,掌握它们对于编写高效、可复用的现代C++代码至关重要。