一、泛型

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::sortstd::findstd::for_each 等都是函数模板,可处理各种容器和类型。

迭代器:通过模板统一了不同容器的遍历接口(如 begin()/end()),让算法能跨容器复用。

四、模版与宏和重载的区别

1.模版和宏:

宏是文本替换,无类型检查(如 #define ADD(a,b) a+b 对 string 调用会编译报错,但宏本身不检查)。模板有严格的类型检查,更安全。

2.模版和重载

重载需要为每个类型手动写函数(如 swap(int&, int&)swap(double&, double&))。模板只需写一次,编译器自动生成重载版本,更简洁。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐