C++:泛型与模版
一、泛型
1.什么是泛型?
泛型是一种编程范式。它的核心思想是:“编写与具体类型无关的通用逻辑,让同一套代码能安全、高效地处理多种数据类型”。它的目标是最大化代码复用。
2.关键字
typename class 除了内部类中的泛型返回需要用typename声明之外,typename和class可以互相转换。
3.泛型参数列表
template <typename 泛型名>
template <typename T1,typename T2,class T3...size_t len>
4.泛型的作用
可以自适应任意类型,使用起来方便,不用关心类型。
二、模版
C++通过模板(Template) 实现泛型思想。模板是一种 “代码生成器”,编译器会根据传入的类型参数或非类型参数,在编译阶段自动生成针对具体类型的代码。
模板分为函数模板和类模板,分别对应通用函数和通用类的实现。
1.函数模板和模板函数
函数模板用于定义 “逻辑相同但操作类型不同” 的函数。
// 模板参数声明:typename T 表示“类型占位符”
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
// 调用时无需显式指定类型,编译器自动推导
int sum1 = add(1, 2); // 推导出 T = int,生成 add<int>(int, int)
double sum2 = add(1.5, 2.5); // 推导出 T = double,生成 add<double>(double, double)
// 也可显式指定类型
auto sum3 = add<long>(3L, 4L); // 显式指定 T = long
return 0;
}
2.类模版和模版类
类模板用于定义 “存储或操作通用类型” 的类(如容器、算法类)。类模板必须显示调用。
注意:如果是多文档编程,声明和定义都要在.h里。
// 类模板:通用的“对”(Pair),存储两个同类型或不同类型的值
template <typename T1, typename T2> // 多个模板参数
class Pair {
private:
T1 first; // 第一个元素
T2 second; // 第二个元素
public:
// 构造函数
Pair(T1 f, T2 s) : first(f), second(s) {}
// 成员函数
T1 getFirst() const { return first; }
T2 getSecond() const { return second; }
};
int main() {
// 类模板必须显式指定类型参数
Pair<int, double> p1(1, 3.14); // T1 = int, T2 = double
cout << p1.getFirst() << ", " << p1.getSecond() << endl;
Pair<string, int> p2("age", 20); // T1 = string, T2 = int
cout << p2.getFirst() << ": " << p2.getSecond() << endl;
return 0;
}
三、泛型与模版的典型应用:STL
C++ 标准模板库(STL)是泛型编程的巅峰实践,其核心组件(容器、算法、迭代器)全靠模板实现:
容器:vector<T>、list<T>、map<K, V> 等都是类模板,支持任意元素类型。
算法:std::sort、std::find、std::for_each 等都是函数模板,可处理各种容器和类型。
迭代器:通过模板统一了不同容器的遍历接口(如 begin()/end()),让算法能跨容器复用。
四、模版与宏和重载的区别
1.模版和宏:
宏是文本替换,无类型检查(如 #define ADD(a,b) a+b 对 string 调用会编译报错,但宏本身不检查)。模板有严格的类型检查,更安全。
2.模版和重载
重载需要为每个类型手动写函数(如 swap(int&, int&)、swap(double&, double&))。模板只需写一次,编译器自动生成重载版本,更简洁。
更多推荐

所有评论(0)