V信公众号: 程序员架构笔记
C++ 中的模板和泛型编程是强大的工具,允许你编写灵活且可重用的代码。模板可以用于函数和类,使得代码能够处理多种数据类型而不需要为每种类型编写单独的版本。STL(Standard Template Library,标准模板库)是 C++ 标准库的一部分,提供了许多常用的数据结构和算法,它们都是基于模板实现的。
1. 函数模板
函数模板允许你编写一个通用的函数,该函数可以处理不同类型的参数。函数模板的定义使用 template
关键字。
template <typename T> T add(T a, T b) { return a + b; } int main() { int result1 = add(3, 4); // T 被推导为 int double result2 = add(3.5, 4.5); // T 被推导为 double return 0; }
在这个例子中,add
函数模板可以用于任何支持 +
操作的类型。
2. 类模板
类模板允许你定义一个通用的类,该类可以处理不同类型的成员变量或方法参数。
template <typename T> class Box { private: T value; public: Box(T v) : value(v) {} T getValue() const { return value; } }; int main() { Box<int> intBox(123); Box<std::string> strBox("Hello"); std::cout << intBox.getValue() << std::endl; // 输出: 123 std::cout << strBox.getValue() << std::endl; // 输出: Hello return 0; }
在这个例子中,Box
类模板可以用于任何类型的 value
。
3. STL 标准模板库
STL 是 C++ 标准库的一部分,提供了许多常用的数据结构和算法。STL 的核心组件包括:
-
容器(Containers):用于存储数据的类模板,如
vector
,list
,map
,set
等。 -
算法(Algorithms):用于操作容器中数据的函数模板,如
sort
,find
,copy
等。 -
迭代器(Iterators):用于遍历容器中元素的对象,类似于指针。
3.1 容器示例
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {5, 2, 9, 1, 5, 6}; // 使用算法对容器进行排序 std::sort(vec.begin(), vec.end()); // 使用迭代器遍历容器 for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } return 0; }
3.2 算法示例
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用算法查找元素 auto it = std::find(vec.begin(), vec.end(), 3); if (it != vec.end()) { std::cout << "Found: " << *it << std::endl; } else { std::cout << "Not found" << std::endl; } return 0; }
4. 模板特化
模板特化允许你为特定的类型提供模板的特定实现。这在某些情况下非常有用,例如当你需要对某些类型进行特殊处理时。
template <typename T> class Box { public: void print() { std::cout << "Generic Box" << std::endl; } }; // 特化版本 template <> class Box<int> { public: void print() { std::cout << "Specialized Box for int" << std::endl; } }; int main() { Box<double> doubleBox; doubleBox.print(); // 输出: Generic Box Box<int> intBox; intBox.print(); // 输出: Specialized Box for int return 0; }
5. 模板元编程
模板元编程(Template Metaprogramming, TMP)是一种在编译时执行计算的技术,通常用于生成高效的代码或实现编译时的逻辑。
cpp
复制
template <int N> struct Factorial { static const int value = N * Factorial<N - 1>::value; }; template <> struct Factorial<0> { static const int value = 1; }; int main() { std::cout << "Factorial of 5: " << Factorial<5>::value << std::endl; // 输出: 120 return 0; }
在这个例子中,Factorial
模板在编译时计算阶乘。
总结
C++ 的模板和泛型编程提供了强大的工具来编写灵活且可重用的代码。通过函数模板、类模板、STL 以及模板特化和模板元编程,你可以构建高效且易于维护的 C++ 程序。