c++学习笔记(9)-模板基础

1、概念

C++中的模板是一种通用的编程工具,可以生成可应对多种数据类型的代码。通过使用模板,可以编写可以处理不同类型数据的函数和类,并提高代码的可重用性和灵活性。

2、模板类型

2.1、函数模板

下面是一个简单的函数模板,用于计算两个数字的最大值:

cpp 复制代码
template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

2.2、类模板

下面是一个简单的类模板,用于实现通用的堆栈数据结构:

cpp 复制代码
template <typename T>
class Stack {
private:
    vector<T> data;
public:
    void push(T value) {
        data.push_back(value);
    }
    void pop() {
        data.pop_back();
    }
};

2.3、成员函数模板

下面是一个简单的类模板,其中包含一个成员函数模板,用于计算两个数字的最大值:

cpp 复制代码
template <typename T>
class Calculator {
public:
    T max(T a, T b) {
        return (a > b) ? a : b;
    }
};

2.4、非类型模板

下面是一个简单的类模板,其中包含一个非类型模板参数N,用于指定数组的大小:

cpp 复制代码
template <typename T, int N>
class Array {
private:
    T data[N];
public:
    T& operator[](int i) {
        return data[i];
    }
};

2.5、类型别名

这个类型模板会把任意类型映射到 int类型。

cpp 复制代码
template <typename... Ts>
using int_t = int;
//使用
int_t<float> say(){
    return 18;
}

3、特化

C++模板中的特化(template specialization)是一种允许为特定类型或值参数提供自定义实现的机制,当需要针对某些类型或值参数提供不同于通用实现的行为时,可以使用模板特化来实现这一点。模板特化包括全局特化和部分特化。其中,全特化指的是所有的模板参数都被指定了具体的类型或值;偏特化指的是部分模板参数被指定了具体的类型或值。

cpp 复制代码
#include <iostream>
using namespace std;

// 通用模板
template <typename T1, typename T2>
class Printer {
public:
    void print() {
        cout << "通用模板" << endl;
    }
};

// 全特化版本
template <>
class Printer<int, double> {
public:
    void print() {
        cout << "全特化模板" << endl;
    }
};

// 偏特化版本
template <typename T>
class Printer<T, double> {
public:
    void print() {
        cout << "偏特化模板" << endl;
    }
};

int main() {
    Printer<double, float> obj1;
    obj1.print();//输出:通用模板

    Printer<int, double> obj2;
    obj2.print();//输出:全特化模板

    Printer<char, double> obj3;
    obj3.print();//输出:偏特化模板

    return 0;
}

4、函数模板匹配

C++中,模板函数匹配(Function Template Argument Deduction)规则如下:

首先查找到函数名匹配的模板;接着根据函数模板参数列表(即模板参数类型及其数量、模板参数的默认值等)进行匹配;当发现有多个匹配的模板的时候,选择匹配度最高的函数模板作为最终的函数模板:全特化>偏特化>通用模板。

相关推荐
Xeon_CC2 分钟前
用C++编写屏幕准星
开发语言·c++
是隼人2 分钟前
buuctf-pwn bjdctf_2020_babystack2题解 整数溢出(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
KhalilRuan1 小时前
UnityCsReference——笔记
java·开发语言·笔记
电子云与长程纠缠1 小时前
UE5 Lyra PocketWorld进行3D内容UI预览 - 上
开发语言·学习·3d·ue5·游戏引擎
shangwen1231 小时前
食品厂无尘车间装修施工工艺笔记:C型钢吊顶加固方案尚文净化
笔记
210Brian1 小时前
STM32学习笔记(六)EXTI外部中断(下)
笔记·stm32·学习
MartinYeung51 小时前
[论文学习]Latent Fusion Jailbreak: 融合有害与无害表征以诱导大语言模型产生不安全输出
学习·安全·语言模型
星恒随风1 小时前
C++ 哈希详解(二):开放定址、哈希桶与 C++ 哈希表底层实现
c++·笔记·学习·哈希算法·散列表
迪丽热爱1 小时前
每日英语-17
学习
lingran__2 小时前
C++ STL unordered系列(哈希) 底层剖析与模拟实现万字详解 | 基于哈希表,复刻 SGI-STL 泛型哈希容器架构
开发语言·c++·后端·哈希算法·哈希表·泛型编程·unordered系列