前言

这里只是简单列出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; // 输出120
}

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...);
}

// 折叠表达式(C++17)
template <typename... Args>
auto sum(Args... args) {
return (args + ...); // 折叠表达式
}

6. 类型萃取与SFINAE

1
2
3
4
5
6
7
8
9
10
11
12
// 使用enable_if
template <typename T>
typename std::enable_if<std::is_integral<T>::value, T>::type
increment(T value) {
return value + 1;
}

// 概念约束(C++20)
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; // 使用自定义分配器的vector

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++中的典型应用场景包括:

  1. 标准库容器:vector, list, map等
  2. 通用算法:sort, find, transform等
  3. 智能指针:unique_ptr, shared_ptr
  4. 类型擦除:any, function
  5. 元编程工具: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;
}