目录

1、什么是模板和泛型编程

2、定义及使用模板


1、什么是模板和泛型编程

什么是模板?什么是泛型编程?模板的概念与泛型编程是相辅相成的。想象一个场景:我们需要比较两个整数或两个字符串的大小,假如你还不知道模板的概念,那大可能会写出两个类似的函数来解决这个问题,就像下面这样:

// 对比两个整数的大小
int compare_int(int v1, int v2) { if(v1 < v2)  return -1; else if(v1 > v2) return 1; else return 0;
}
// 对比两个字符串的大小(按字典序比较)
int compare_str(string s1, string s2) { if(v1 < v2)  return -1; else if(v1 > v2) return 1; else return 0;
}

仔细品味这两个函数,其实两者现原理一摸一样,既然能用同样的方法实现,为何还要写两个函数呢?有没有通用的方法是用一个函数来解决呢?有的有的,函数模板就是干这种活儿的,干这活的过程就是泛型编程,这里“泛型”的意思就是“通用”的意思。除了函数模板外,还有类模板等。

2、定义及使用模板

以函数模板为例,上一节问题写成模板的形式就是下面这样:

template <typename T>
int compare(const T &v1, const T &v2){ if(v1 < v2)  return -1; else if(v1 > v2) return 1; else return 0;
}

模板定义以关键字 template 开头,后跟一个模板参数列表,这是一个逗号分隔开的一个或多个模板参数。在模板定义过程中我们将模板参数 T (习惯用T,也可以用其他任意合法名字表示)当作替身,代替使用模板时用户提供的类型或值。

模板类型参数可以使用关键字 class 或 typename ,在模板参数列表中这两个关键字含义相同,可以互换调用,一个模板参数列表中可以同时使用这两个关键字。(为什么有两个呢?typename 是后来引入的,看起来会比 class 直观些)

template <typename T, class U> calc(const T&, const U&);

模板的实例化及编译过程解释:

如上述 compare 函数模板,我们用 T 表示一个类型,在编译时编译器会根据函数具体的实参来自动推断模板实参类型。

另外在编译过程中,为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义,因此与非模板代码不同,函数模板和类模板成员函数的定义通常放在头文件中。(非模板函数一般是把声明放在头文件中,具体的定义放在源文件中)

C++ 模板与泛型编程简述相关推荐

  1. c++ swap函数头文件_C++函数模板(泛型编程)

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...

  2. C++ Primer 学习笔记_75_模板与泛型编程 --模板定义

    模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...

  3. c++ 函数模板_C++函数模板(泛型编程)

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...

  4. Effective C++ 学习笔记 第七章:模板与泛型编程

    第一章见 Effective C++ 学习笔记 第一章:让自己习惯 C++ 第二章见 Effective C++ 学习笔记 第二章:构造.析构.赋值运算 第三章见 Effective C++ 学习笔记 ...

  5. (十六)模板与泛型编程

    (十六)模板与泛型编程 1定义模板 1.1函数模板 1.2类模板 1.2.1定义 1.2.2实例化 1.2.3类模板与友元 1.2.4类模板类型别名 1.2.5类模板静态函数 1.3模板参数 1.4成 ...

  6. 读书笔记--模板与泛型编程

    了解隐式接口和编译期多态 编译期多态和运行期多态 运行期多态就好比是virtual函数再运行的时候才确定该virtual函数该被绑定为哪个函数,运行的时候才确定函数类型. 编译期多态就好比是泛型编程和 ...

  7. C++ Primer学习笔记-----第十六章:模板与泛型编程

    模板是C++中泛型编程的基础. 模板是蓝图,用来创建类型,创建的类型就是模板的实例,就好像我们用一个类型创建相应的实例一样. 函数模板 template<typename T> //模板参 ...

  8. 《Effective C++》 总结篇(模板与泛型编程)

    条款四十一:了解隐式接口的和编译期多态 和面向对象编程的显示接口和运行期多态不同, 泛型编程更多是隐式接口和编译期多态. #include <iostream> using namespa ...

  9. 【effective c++读书笔记】【第7章】模板和泛型编程(3)

    条款46:需要类型转换时请为模板定义非成员函数 对条款24的例子进行模板化: #include<iostream> using namespace std;template<type ...

最新文章

  1. [ZZ]好的测试应该具备哪些特质?
  2. python list索引_Python按照索引访问list
  3. 编程之美-蚂蚁爬杆方法整理
  4. c程序设计语言用什么编译器,什么是编译器(编程软件)
  5. 巧用HashMap一行代码统计单词出现次数
  6. 在线机器学习FTRL(Follow-the-regularized-Leader)算法介绍
  7. 详细分析图像形态学操作
  8. Win7中多账户设置自动登录的图文方法
  9. 基于channel的goroutine
  10. SouthidcEditor编辑器如何支持上传png图片
  11. mouseover 和 mouseenter
  12. SVN局域网服务器搭建
  13. 最新EyouCMS发布工具
  14. GICv3软件overview手册之配置GIC
  15. 从阿里双十一看云计算
  16. 笔记本电脑计计算机硬盘分区,笔记本电脑如何分区,教您笔记本电脑如何分盘...
  17. python爬虫+网页点击事件+selenium模拟浏览器,爬取选股宝内容
  18. Android App 耗电的测试方法
  19. Gradle project sync failed. Please fix your project and try again
  20. 2022-CS224n-Assignment1-exploring_word_vectors

热门文章

  1. 职场必学的10个常用网站-活动策划
  2. webgoat靶场复现
  3. 图的顺序存储结构(包含C语言实现)
  4. MFC文件操作之CStdioFile
  5. 电力电子变压器。 整流级采用级联H桥多电平拓扑,由三个H桥模块级联
  6. HTML基础知识(四)——浮动
  7. ToB 服务的交付能力优化
  8. 如何下载到纯净的Google Chrome或者Chromium浏览器
  9. 1209_MISRA_C规范学习笔记_Rule 10.6
  10. C语言~宏操作大全(宏定义、内置宏、__FILE__、__LINE__、##用法)