C++模板超详细介绍

目录
  • 1.前言
  • 2.函数模板
  • 3.类模板

1.前言

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

模板是创建泛型类或函数的蓝图或公式。

通常有两种形式:函数模板和类模板;

2.函数模板

函数模板针对仅参数类型不同的函数

一般形式为:

template <类型形式参数表>
类型 函数名( 形式参数表)
{
   // 函数的主体
}

函数调用实例:

#include <iostream>
#include <string>
using namespace std;
template <typename T>
inline T const& Max(T const& a, T const& b)
{
	return a < b ? b : a;
}
int main()
{
	int x1 = 114514;
	int x2 = 121212;
	cout << "Max: " << Max(x1, x2) << endl;//隐式调用
    int x3 = 114514;
	int x4 = 'a';
    //cout << "Max: " << Max(x3, x4) << endl;//无法通过编译
	cout << "Max: " << Max<int>(x3, x4) << endl;//显示调用
	double f1 = 13.5;
	double f2 = 24.6;
	cout << "Max: " << Max(f1, f2) << endl;
	string s1 = "Yuta";
	string s2 = "Rokka";
	cout << "Max: " << Max(s1, s2) << endl;
	return 0;
}

根据此样例我们得注意:

1. 函数模板分为两种调用方式:

显示模板实参调用(显示调用),隐式模板实参调用(隐式调用)。

2.隐式调用不需要显示给出模板参数,直接经过参数推演进行调用。

3. 显示调用则不需要推演直接根据显示给出的模板参数进行调用。

x3和x4因为类型不同,在比较中因为函数无法从这两个参数中进行类型推演,所以不能进行。

所以一般建议调用时采取显示调用,便于代码的理解和维护。

结果:

3.类模板

类模板针对仅数据成员和成员函数类型不同的类。

对于类模板的使用而言,没有隐式模板实参和显式模板实参使用的说法,因为类模板的使用必须显示指明模板实参。

一般形式为:

template <class type>
class 类名 {
.
.
.
}

样例:

#include <iostream>
using namespace std;
template<typename T>
class A {
private:
	T num;
public:
	A()
	{
		num = T(6.6667);
	}
	void print()
	{
		cout << "num:" << num << endl;
	}
};
int main() {
	A<int> a; //显示模板实参的隐式实例化
	a.print();
}

需要注意,此时我们调用模板类的时候,必须是以显示调用的方式来进行,不然会经典报错。

解决方法便是显示给出模板参数 啦

样例结果:

到此这篇关于C++模板超详细介绍的文章就介绍到这了,更多相关C++模板内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++印刷模板使用方法详解

    目录 一.泛型编程 二.模板(初阶) 1.函数模板 1.单参数类型 2.多参数类型 3.模板函数和自定义函数 2.类模板 3.模板不支持分离编译 在了解string之前,我们需要了解模板等等的一些铺垫知识,让我们开始吧! 一.泛型编程 泛型编程是什么意思呢?我们通过下面的例子来具体了解: void Swap(int& left, int& right) { int temp = left; left = right; right = temp; } void Swap(double&

  • C++多态特性之派生与虚函数与模板详细介绍

    目录 继承与派生 虚函数 父类代码如下 模板 函数模板 类模板 字符串 继承与派生 C ++ 是面向对象编程,那么只要面向对象,都会有多态.继承的特性.C++是如何实现继承的呢? 继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程.例如类 B 继承于类 A,那么 B 就拥有 A 的成员变量和成员函数. 在C++中,派生(Derive) 和继承是一个概念,只是站的角度不同.继承是儿子接收父亲的产业,派生是父亲把产业传承给儿子. 被继承的类称为父类或基类,继承的类称

  • C++泛型模板约束深入讲解

    CPP参考:(新标准) 传送门 模板对于类型的约束: 约束 template_get_size 泛型T只允许接受类型:list<T>,其实为 C/C++ 泛型模板例化特性,但与泛型模板例化略微有些区别,因为是带泛型类型约束条件的特例化. template<typename T> class list { public: int count = 0; }; template<typename T> struct template_get_size; template<

  • 详解C++中函数模板的定义与使用

    目录 1. 前言 2. 初识函数模板 2.1 语法 2.2 实例化 2.3 实参推导 3. 重载函数模板 1. 前言 什么是函数模板? 理解什么是函数模板,须先搞清楚为什么需要函数模板. 如果现在有一个需求,要求编写一个求 2 个数字中最小数字的函数,这 2 个数字可以是 int类型,可以是 float 类型,可以是所有可以进行比较的数据类型…… 常规编写方案:针对不同的数据类型编写不同的函数. #include <iostream> using namespace std; //针对 int

  • C++模板编程特性之移动语义

    目录 C++的值类型 右值引用与移动构造和移动赋值 C++的值类型 我们知道,每个变量都有类型,或整形或字符型等来进行了分类,不仅如此,C++表达式(带有操作数的操作符.字面量.变量名等)在类型的属性上,还有一种属性,即值类别(value category).且每个表达式只属于三种基本值尖别中的一种:左值(lvalue),右值(rvalue),将亡值(xvalue),每个值类别都与某种引用类型对应. 其中,左值和将亡值成为泛左值(generalized value,gvalue),纯右值和将亡值

  • C++可变参数模板深入深剖

    目录 概念 模板定义 参数包展开 递归函开 逗号表达式展开 emplace 使用方法 工作原理 意义 总结 概念 C++11 新增一员猛将就是可变参数模板,他可以允许可变参数的函数模板和类模板来作为参数,使得参数高度泛化. 在 C++11 之前类模板和函数模板中只能包含固定数量模板参数,而且也有可变参数的概念,比如 printf 函数就能够接收任意多个参数,但这是函数参数的可变参数,并不是模板的可变参数.可变模板参数无疑是一个巨大的改进,但由于可变参数模板比较抽象,因此使用起来并不会太简单. 模

  • C++图文并茂分析讲解模板

    目录 1.内容引入 2.模板函数 C语言写交换函数 C++写交换函数 模板交换函数的语法及其原理 语法 原理 理解显示实例化和隐式实例化 关于编译器也是懒人这件事 3.类模板 1.内容引入 ​ 不知道大家是否在高中时背过英语范文模板,以下就是博主的回忆: ​ 这篇模板是一些英语比较好的老师写的. ​ 每当碰到感谢信时,我都会狂喜,尽管感谢的内容不同,地点不同,我都可以去根据模板,再根据作文分析模板的那些空对应应该填入什么. 其实呢c++中也用模板,但是这个时候,我们是写模板的人,而编译器变成了那

  • C++模板超详细介绍

    目录 1.前言 2.函数模板 3.类模板 1.前言 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式. 通常有两种形式:函数模板和类模板: 2.函数模板 函数模板针对仅参数类型不同的函数 一般形式为: template <类型形式参数表> 类型 函数名( 形式参数表) { // 函数的主体 } 函数调用实例: #include <iostream> #include <string> using namespa

  • Vue计算属性与侦听器和过滤器超详细介绍

    目录 1. 计算属性 1.1 使用方法 1.2 案例-购物车合计使用计算属性 2. 侦听器 3. 过滤器 1. 计算属性 1.1 使用方法 概述: 模板中放入太多的逻辑会让模板过重且难以维护,使用计算属性可以让模板变得简洁易于维护.计算属性是基于它们的响应式依赖进行缓存的,计算属性比较适合对多个变量或者对象进行处理后返回一个结果值,也就是数多个变量中的某一个值发生了变化则我们监控的这个值也就会发生变化. 计算属性定义在Vue对象中,通过关键词computed属性对象中定义一个个函数,并返回一个值

  • Android超详细介绍自定义多选框与点击按钮跳转界面的实现

    总程:在avtivity_main.xml设计5个控件,btn1-5,点击btn1弹出一个多选对话框,点击按钮btn1弹出一个多选框可选择你喜欢的打野英雄,点击btn2跳转到activity_main2界面(就是图片,不可选择)设计思路流程:在activity_main.xml布局界面,总体在头目录进行垂直排列,然后镶嵌5个水平的线性布局(左是ImageView,右边是Button按钮)由于5张图的大小在一个屏幕显示不出来,所以添加一个ScoveView滚动,以使所有资源可以看到! 在MainA

  • C语言 超详细介绍与实现线性表中的带头双向循环链表

    目录 一.本章重点 二.带头双向循环链表介绍 2.1什么是带头双向循环链表? 2.2最常用的两种链表结构 三.带头双向循环链表常用接口实现  3.1结构体创建 3.2带头双向循环链表的初始化  3.3创建新节点 3.4尾插 3.5打印链表 3.6头插 3.7尾删 3.8头删 3.9查找data(返回data的节点地址) 3.10在pos位置之前插入节点 3.11删除pos位置的节点 四.实现接口总结 五.在线oj训练与详解 一.本章重点 带头双向循环链表介绍 带头双向循环链表常用接口实现 实现接

  • C语言 超详细介绍与实现线性表中的无头单向非循环链表

    目录 一.本章重点 二.链表介绍 三.无头单向非循环链表常用接口实现 3.1动态申请一个节点 3.2单链表打印 3.3单链表尾插 3.4单链表的头插 3.5单链表的尾删 3.6单链表头删 3.7单链表查找 3.8单链表在pos位置之前插入x 3.9单链表删除pos位置的节点 四.在线oj训练 4.1移除链表元素(力扣) 4.2反转单链表(力扣) 一.本章重点 无头单向非循环链表介绍 无头单向非循环链表常用接口实现 在线oj训练 二.链表介绍 概念:链表是一种物理存储结构上非连续.非顺序的存储结构

  • Java超详细介绍抽象类与接口的使用

    目录 1.抽象类的语法和特性 1.1语法 1.2特性 2.接口的语法和使用 2.1语法 2.2特性 1.抽象类的语法和特性 1.1语法 1.在Java中,一个类如果被abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体. // 抽象类:被abstract修饰的类 public abstract class Shape { // 抽象方法:被abstract修饰的方法,没有方法体 abstract public void draw()

  • Java超详细介绍封装与访问控制修符

    概念:我们在写入一个类的时候,为了保护里边的属性不被随意的调用这是我们可以使用特殊的修饰符进行相应的保护,而这样的话我们似乎只能在该类中调用使用了,出现某些特殊情况时就会无法发调用,虽然挺高了安全性但也降低了灵活性,这个时候我们的包装类就出现了,我们通过对某个方法的进行特殊方法的包装来对其进行相应的调用与赋值.就相当于银行为了保护财产会选择将金钱放进保险柜中来确保其的安全,但是当我们要取钱时,银行就要拿钥匙打开保险柜.修饰符相当于银行的保险柜,封装相当于保险柜的钥匙. 访问修饰符如下: 1) p

  • SpringMVC超详细介绍自定义拦截器

    目录 1.什么是拦截器 2.自定义拦截器执行流程图 3.自定义拦截器应用实例 1.快速入门 2.注意事项和细节 3.Debug执行流程 4.多个拦截器 1.多个拦截器执行流程示意图 2.应用实例 3.主要事项和细节 1.什么是拦截器 说明 Spring MVC 也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能. 自定义的拦截器必须实现 HandlerInterceptor 接口 自定义拦截器的三个方法 preHandle():这个方法在业务处理器处理请求之前被调用,在该方

  • C++智能指针模板应用详细介绍

    目录 智能指针模板类 使用智能指针 关于智能指针的注意事项 unique_ptr优于auto_ptr 选择智能指针 weak_ptr 智能指针模板类 void remodel(std::string & str) { std::string *ps =new std::string(str); .... if(oh_no) throw exception(); ... delete ps; return; } 如果上面这段函数出现异常,那么就会发生内存泄漏.传统指针在执行动态内存分配时具有缺陷,

  • MySql约束超详细介绍

    目录 1. 什么是约束 2. 约束包括哪些 3. 非空约束 4. 唯一性约束 1. 单字段唯一性约束 2. 多字段唯一性约束 5. 主键约束 1. 主键约束的相关术语 2. 什么是主键以及有啥用 3. 单一主键 4. 复合主键 5. 其他主键 6. 外键约束 1. 外键约束的相关术语 2. 外键出现的原因 3. 创建外键表 1. 什么是约束 约束对应的英语单词:constraint 在创建表的时候,我们可以给表中的字段加上一些约束,来保证表中的数据的完整性.有效性!!! 约束的作用就是为了保证:

随机推荐