IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++模板编程】 -> 正文阅读

[C++知识库]【C++模板编程】

title: 8.6.11&12 模板编程 tags: notebook: 8.0 工作准备

一、 模板概念

C++ 的抽象机制

  • 面向对象:要了解编译知识
  • 泛型编程:设计通用的类型或算法
  • 元编程:使用模板进行选择和迭代,通过模板设计程序

模板多态

  • 静态

二、泛型编程

函数模板

匹配优先级:先匹配普通函数,再匹配特化模板函数,最后是通用模板函数。

模板函数

  • 由代码决定生成多少个模板函数,导致程序变大
template<typename T>
void add(T a, T b) {
    ...
}

特化模板

  • 一定要写到通用模板后面
template<typename T>
void add(T a, T b) {
    ...
}
template<>
void add(int a, int b) {
    ...
}

返回值类型

  • C++14可以用auto进行返回值推导
  • C++11 可以用decltype( )进行类型推导,返回是类型
    • 返回值后置
template<typename T, typename U>
auto add(T a, T b)->decltype(a + b) {
    return a + b;
}

T&&

  • 在模板编程中表示既匹配左值,又匹配右值

万能的引用传递

  • 在模板函数中,类型为左值引用
  • 配合std::forward<T>( )使用,可以转换为传进来的类型
  • 如何把模板的左值引用改为普通左值类型
typename std::remove_reference<T>::type c = a;

模板类

模板类

template<typename U>
class Print
{

}
  • 模板类也可以指定类型,然后特化指定数值

模板类的特化

template<>
class Print<int>

  • 对指定类型的模板进行特化,特化传入的为数值

变参模板

定义方式

template<class T, class ...ARGS>
void print(T& t, ARGS ...args) {


}

三、元编程

图灵完备性

  1. 要有基本的数据类型
  2. 需要某种方法,将基础的类型组合起来
  3. 需要流程控制。例如顺序、分支、循环
  4. 需要输入、输出。

编译时处理的变量

  • using
  • #define
  • constexpr

练习1

  • 实现sum函数
#include <iostream>

using namespace std;

template<int N>
struct mySum {
    static constexpr int value = \
        mySum<N - 1>::value + N;
};

template<>
struct mySum<0> {
    static constexpr int value = 0;
};

int main(int argc, char const *argv[]) {
    cout << mySum<100>::value << endl;
    return 0;
}

四、类型萃取

#include <iostream>
#include <vector>

using namespace std;


// 不使用类型萃取,无法计算int[] 的sum值
// 原因:传入的指针没有value_type
template<class iter>
typename iter::value_type MySum(iter b, iter e) {
    typename iter::value_type res{0};
    for (iter i = b; i != e; i++) {
        res += *i;
    }
    return res;
}

//类型萃取:特化没有value_type的指针类型
template<typename iter>
struct transType {
    // 注意:这里要加typename
    using value_type = typename iter::value_type;
};
template<typename iter>
struct transType<iter*> {
    using value_type = iter;
};

template<class iter>
typename transType<iter>::value_type MySum2(iter b, iter e) {
    typename transType<iter>::value_type res{0};
    for (iter i = b; i != e; i++) {
        res += *i;
    }
    return res;
}



int main(int argc, char const *argv[])
{
    vector<int> arr{1, 2, 3, 54, 7};
    
    cout << MySum(arr.begin(), arr.end()) << endl;

    int arr2[] = {1,2,4,5,4124};
    cout << MySum2(arr2, arr2 + 5) << endl;


    return 0;
}

其他

  • 模板不能写在cpp中
  • 模板类成员方法不能用虚函数
    • 虚函数表是在编译中生成
    • 如果使用模板,则.h文件会遍历所有cpp文件,做不到
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:05:37  更:2021-12-15 18:06:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:52:33-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码