前言
这里只是简单列出C++语言与泛型编程
总述:泛型编程的核心概念
泛型编程是C++的核心编程范式之一,通过参数化类型实现代码复用。其核心思想是编写与数据类型无关的通用代码,主要依赖模板机制实现。泛型编程优势包括:
- 类型安全:编译时类型检查
- 性能优化:避免运行时开销
- 代码复用:减少重复代码
- 抽象提升:更高层次的算法抽象
分述:核心语法与特性
1. 函数模板
1 2 3 4 5 6 7 8
| template <typename T> T max(T a, T b) { return (a > b) ? a : b; }
int m1 = max(10, 20); double m2 = max<double>(5.5, 3.2);
|
2. 类模板
1 2 3 4 5 6 7 8 9 10 11 12 13
| template <typename T, int Size> class Array { private: T data[Size]; public: T& operator[](int index) { return data[index]; } };
Array<int, 5> intArr; Array<std::string, 10> strArr;
|
3. 模板特化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| template <typename T> class Printer { public: void print(const T& value) { std::cout << "Value: " << value << std::endl; } };
template <> class Printer<std::string> { public: void print(const std::string& value) { std::cout << "String: " << value << std::endl; } };
template <typename T> class Printer<T*> { public: void print(const T* value) { std::cout << "Pointer: " << *value << std::endl; } };
|
4. 非类型模板参数
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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<5>::value; }
|
5. 变长参数模板(C++11)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void print() {}
template <typename T, typename... Args> void print(T first, Args... args) { std::cout << first << " "; print(args...); }
template <typename... Args> auto sum(Args... args) { return (args + ...); }
|
6. 类型萃取与SFINAE
1 2 3 4 5 6 7 8 9 10 11 12
| template <typename T> typename std::enable_if<std::is_integral<T>::value, T>::type increment(T value) { return value + 1; }
template <std::integral T> T decrement(T value) { return value - 1; }
|
7. 模板元编程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| template <int N, int D = N-1> struct IsPrime { static const bool value = (N % D != 0) && IsPrime<N, D-1>::value; };
template <int N> struct IsPrime<N, 1> { static const bool value = true; };
template <int N> struct IsPrime<N, 0> { static const bool value = false; };
|
8. 别名模板(C++11)
1 2 3 4 5
| template <typename T> using Vec = std::vector<T, CustomAllocator<T>>;
Vec<int> customVector;
|
9. 变量模板(C++14)
1 2 3 4 5 6
| template <typename T> constexpr T pi = T(3.1415926535897932385);
float f = pi<float>; double d = pi<double>;
|
总结:泛型编程的应用与最佳实践
泛型编程在C++中的典型应用场景包括:
- 标准库容器:vector, list, map等
- 通用算法:sort, find, transform等
- 智能指针:unique_ptr, shared_ptr
- 类型擦除:any, function
- 元编程工具:type_traits, enable_if
最佳实践原则:
- 优先使用STL:避免重复造轮子
- 限制模板类型:使用static_assert或概念约束
- 避免过度泛化:平衡通用性与可读性
- 注意代码膨胀:合理使用显式实例化
- 利用编译时计算:提升运行时性能
随着C++20引入概念(Concepts),泛型编程进入新阶段:
1 2 3 4 5 6 7 8 9 10
| template <typename T> concept Addable = requires(T a, T b) { { a + b } -> std::convertible_to<T>; };
template <Addable T> T add(T a, T b) { return a + b; }
|
版权声明: 此文章版权归曦曦所有,如有转载,请注明来自原作者