在编程,特别是在 C++ 中,模板是一种强大的功能,允许你创建泛型代码。使用模板可以让你编写一次代码,而在不同类型上重复使用。
C++ 中主要有两种类型的模板:
1.函数模板 (Function Template):允许创建可以处理不同数据类型的函数。
2.类模板 (Class Template):允许创建可以处理不同数据类型的类。
1. 函数模板
函数模板用于定义一个函数,其中至少一个参数是类型参数。以下是一个简单的函数模板示例:
#include <iostream>
// 定义一个函数模板
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
std::cout << add<int>(3, 4) << std::endl; // 输出: 7
std::cout << add<double>(3.5, 4.2) << std::endl; // 输出: 7.7
return 0;
}
/*add 函数模板接受一个类型参数 T,可以处理任何类型的加法运算(只要 + 操作符被重载)。*/
2. 类模板
类模板允许定义一个类,其中至少一个数据成员是类型参数。以下是一个简单的类模板示例:
#include <iostream>
// 定义一个类模板
template <typename T>
class Pair {
private:
T first;
T second;
public:
Pair(T a, T b) : first(a), second(b) {}
T getFirst() const { return first; }
T getSecond() const { return second; }
};
int main() {
Pair<int> intPair(1, 2);
std::cout << "First: " << intPair.getFirst() << ", Second: " << intPair.getSecond() << std::endl; // 输出: First: 1, Second: 2
Pair<std::string> stringPair("Hello", "World");
std::cout << "First: " << stringPair.getFirst() << ", Second: " << stringPair.getSecond() << std::endl; // 输出: First: Hello, Second: World
return 0;
}
//Pair 类模板可以与不同的数据类型(如 int 和 std::string)一起使用。
3. 模版特化(为特定类型提供不同的实现)
#include <iostream>
// 原始模板定义
template <typename T>
class MyClass {
public:
void print() { std::cout << "Template version" << std::endl; }
};
// 模板特化
template <>
class MyClass<int> {
public:
void print() { std::cout << "Specialized version for int" << std::endl; }
};
int main() {
MyClass<double> obj1;
obj1.print(); // 输出: Template version
MyClass<int> obj2;
obj2.print(); // 输出: Specialized version for int
return 0;
}
4. 优缺点
优点
- 代码复用:使用模板可以避免为每种数据类型编写重复代码。
- 类型安全:模板在编译时进行类型检查,以确保类型安全。
- 泛型编程:可以设计出灵活和高效的算法和数据结构。
缺点
- 编译时间增加:模板可能会导致较长的编译时间。
- 调试复杂性:使用模板时,生成的错误信息通常较难理解,调试可能更为复杂。