c++取经之路(其八)——基础模板

2024-04-24 23:12
文章标签 基础 模板 c++ 取经 其八

本文主要是介绍c++取经之路(其八)——基础模板,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我认为的模板其实就是个懒人工具,你来弄个模板,编译器自动给你生成对应的函数。

函数模板:


定义:函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。

我们来举个加法的例子:
基本写法:

template<typename T>
T add( T& x, T& y)
{return x+y;   
}

格式类似于:
template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名(参数列表){}

注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

这就是我们最简单的写法,我们怎么用呢?

template<typename T>
T add(T x, T y)
{return x + y;
}int main()
{cout <<add(1, 2)<<endl;cout << add(1.1, 2.) << endl;return 0;
}

结果:

匹配机制:

 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板

例如:

int Add(int left, int right)
{return left + right;
}// 通用加法函数
template<class T1, class T2>
auto Add(T1 left, T2 right)
{return left + right;
}void Test()
{cout<<Add(1, 2)<<endl; // 与非函数模板类型完全匹配,不需要函数模板实例化cout<<Add(1, 2.1)<<endl; // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add                                 
}int main()
{Test();return 0;
}

运行结果:

类模板:

基本定义:

template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};

注意:我们类模板不建议定义和声明到两个.h和.cpp文件里面,如果想分离一般都在.h文件进行,一般这样写:

template<typename T>
class Sql
{
public:Sql(int x=4);
private:T* _data;int size;int capacity;
};template<typename T >
Sql<T>::Sql(int x)
{_data = new T[x];_capacity = 0;_size = 0;
}

模板注意:

1.模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换。

2.类模板是一个类家族,模板类是通过类模板实例化的具体类。

3.模板是代码复用的重要手段。

4..模板类是一个家族,编译器的处理会分别进行两次编译,其处理过程跟普通类不一样。

这篇关于c++取经之路(其八)——基础模板的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933105

相关文章

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

SpringBoot基础框架详解

《SpringBoot基础框架详解》SpringBoot开发目的是为了简化Spring应用的创建、运行、调试和部署等,使用SpringBoot可以不用或者只需要很少的Spring配置就可以让企业项目快... 目录SpringBoot基础 – 框架介绍1.SpringBoot介绍1.1 概述1.2 核心功能2

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL