C++中的泛型编程(Generic Programming)是一种编程范式,它允许程序员编写与类型无关的代码,这些代码可以在多种不同的数据类型上重用。泛型编程的主要目标是减少代码的重复,提高代码的可重用性和灵活性。
C++提供了两种主要的泛型编程工具:模板(Templates)和STL(Standard Template Library,标准模板库)。
模板
模板是C++泛型编程的基础。它们允许程序员定义与类型无关的函数和类,然后在编译时根据具体的类型实例化这些函数和类。模板可以分为函数模板和类模板。
函数模板
函数模板允许程序员定义一种可以处理多种数据类型的函数。函数模板的语法如下:
cpp复制代码
template <typename T> | |
void myFunction(T arg) { | |
// 函数体 | |
} |
在上面的例子中,T
是一个类型参数,可以在调用函数时指定具体的类型。
类模板
类模板允许程序员定义一种可以处理多种数据类型的类。类模板的语法与函数模板类似:
cpp复制代码
template <typename T> | |
class MyClass { | |
public: | |
T value; | |
MyClass(T v) : value(v) {} | |
// 成员函数等... | |
}; |
在这个例子中,MyClass
是一个类模板,它包含一个类型为T
的成员变量value
。在实例化MyClass
时,可以指定T
的具体类型。
STL(标准模板库)
STL是C++标准库的一部分,它包含了一系列基于模板的容器、迭代器、算法等。STL的设计目标是提供高效、通用和可扩展的组件,以支持泛型编程。
STL中的容器包括vector
、list
、map
、set
等,它们可以存储任意类型的数据。STL中的算法则可以对这些容器中的数据进行操作,如排序、查找、迭代等。由于STL是基于模板的,因此它可以与任何支持迭代器的数据类型一起使用。
泛型编程的优势
泛型编程具有以下优势:
- 代码重用:通过编写与类型无关的代码,可以在多种数据类型上重用相同的代码。
- 类型安全:在编译时检查类型,确保类型的正确性。
- 灵活性:可以轻松地扩展代码以处理新的数据类型,而无需修改现有代码。
- 性能优化:由于类型在编译时已知,编译器可以进行优化以提高性能。
示例
下面是一个使用函数模板的示例,该函数模板可以计算两个数的和:
cpp复制代码
#include <iostream> | |
template <typename T> | |
T add(T a, T b) { | |
return a + b; | |
} | |
int main() { | |
std::cout << add(3, 4) << std::endl; // 输出 7 | |
std::cout << add(3.14, 2.71) << std::endl; // 输出 5.85 | |
return 0; | |
} |
在这个示例中,add
函数模板可以处理整数和浮点数等数据类型。