首页 > 编程语言 >模板——实现泛型编程的有力武器

模板——实现泛型编程的有力武器

时间:2024-11-17 19:19:29浏览次数:3  
标签:right int double 编程 实例 泛型 模板 left

模板——实现泛型编程的有力武器

前言:关于模板,相信大家都有所而闻,以下是我对C++模板的个人看法,希望能够帮助到你们呀!

我们为什么需要模板?

  请到大家看这一段代码?

void Swap(int& left, int& right)
{
  int temp = left;
  left = right;
  right = temp;
}
void Swap(double& left, double& right)
{
  double temp = left;
  left = right;
  right = temp;
}
void Swap(char& left, char& right)
{
  char temp = left;
  left = right;
  right = temp;
}

  我们发现这是实现left和right数值交换的Swep函数,这三段代码,区别仅仅在于数据类型的不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数,有没有什么办法解决类似的问题?这个时候,能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

模板

  1. 函数模板格式
template<typename T>
void Swap( T& left,  T& right)
{
 T temp = left;
 left = right;
 right = temp;
}

注意:typename是用来定义模板参数关键字,也可以使用class

2.函数模板的原理

  对于模板函数的使用,在编译器编译阶段,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。
原理图解释
3.函数模板的实例化
  用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。

(1) 隐式实例化:让编译器根据实参推演模板参数的实际类型.

template<class T>
T Add(const T& left, const T& right)
{   
 return left + right;
 }
 int main()
 {    
 int a1 = 10, a2 = 20;  
 double d1 = 10.0, d2 = 20.0;  
 Add(a1, a2);   
 Add(d1, d2);      
   /*     
      通过实参a1将T推演为int,通过实参d1将T推演为double类型,
      但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int 或者 double类型而报错

如果我们想传两个不同类型的实参呢?此时有两种处理方式:

  1. 用户自己来强制转化
    Add(a, (int)d);
  2. 使用显式实例化
    显式实例化:在函数名后的<>中指定模板参数的实际类型.
int main(void)
{    
  int a = 10;  
  double b = 20.0;          
  Add<int>(a, b);   // // 显式实例化 
  return 0;
}

3.类模板
(1).类模板的定义格式

template<class T1, class T2, ..., class Tn> class 类模板名
{ 
// 类内成员定义
};    
#include<iostream>
using namespace std;
// 类模版
template<typename T>
class Stack
{
public:    
Stack(size_t capacity = 4)
    {     
       _array = new T[capacity]; 
       _capacity = capacity;                     
       _size = 0; 
    }
    void Push(const T& data);
    private:   
     T* _array;   
      size_t _capacity;   
      size_t _size;
};
// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误,具体原因后面会讲
template<class T>
void Stack<T>::Push(const T& data)
{
 // 扩容
 _array[_size] = data;
 ++_size;
}
int main()
{
 Stack<int> st1;    // int
 Stack<double> st2; // double
 return 0;
}

(2) 类模板的实例化
类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可。

// Stack是类名,Stack<int>才是类型
Stack<int> st1;    // int
Stack<double> st2; // double

(完)

标签:right,int,double,编程,实例,泛型,模板,left
From: https://blog.csdn.net/2301_80309505/article/details/143528649

相关文章

  • “合肥-六安”编程活动选拔赛
    **T1**科丁星球和地球建立了外邦关系。地球的数字使用的计数方法是“逢十进一”。但是科丁星球的数字使用的计数方法是“逢九进一”。将地球数字正整数n转换成对应的科丁星球数字的过程:将n除以9,得到的商继续除以9,将余数存储起来,直到其商为0时结束运算。最后将得到的所有......
  • 分享一个易优cms响应式合同申请书报告网站模板
    在当今信息爆炸的时代,知识付费逐渐成为一种趋势,人们愿意为高质量的信息和服务买单。对于那些希望搭建一个专业且用户友好的知识付费网站的创业者来说,选择合适的网站模板至关重要。本文将介绍一款基于易优CMS的内容管理系统开发的知识付费网站模板——响应式合同申请书报告知识......
  • gofiber: 模板: 页面上用range循环显示
    一,代码:1,controllerfunc(dc*ArticleController)ListArticle(c*fiber.Ctx)error{ //处理获取文章的逻辑 article1:=new(Article) article1.Id=1 article1.Title="三国演义毛宗岗批本" article1.Author="罗贯中" article2:=new(Article) article2.Id......
  • C++ 模板
    C++模板Created:2024-03-24T20:24+08:00Published:2024-11-17T16:37+08:00Categories:CPP目录偏特化类模板函数模板形参包Question我记不住模板的语法,尤其是偏特化的语法,怎么办?面试问题利用类模板和函数模板实现编译器计算斐波那契数列模板的声明和定义为什么不能分开写......
  • 读代码真的能让你成为更好的程序员吗?深入解析编程学习的正确方法
    开篇问候大家好,我是hikktn!从去年开始直播写代码后,许多粉丝就不断向我提出这样的问题:“你的代码能不能分享给我们学习?”他们并不是为了窃取商业机密,而是希望通过阅读代码,提升自己的编程能力。还有一些粉丝希望我推荐优秀的开源软件,下载后通过研究代码来获得启发。每次遇......
  • 编程语言的对比
    首先是编程语言的发音:我以前把python发音错读作飞人。因为单词物理physics的phy发音读飞,所以我把python的py也读飞,其实应该读派。then发音读人,所以我把python的thon也读人,其实应该读森。所以python应该读派森,而不是读作飞人。python是编程语言排行榜第一的语言。C#有个井号,所......
  • 7、GIC介绍与编程
    1.1GIC介绍ARM体系结构定义了通用中断控制器(GIC),该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断......
  • 网络编程-002-UDP通信
    1.UDP通信的简单介绍1.1不需要通信握手,无需维持连接,网络带宽需求较小,而实时性要求高1.2包大小有限制,不发大于路径MTU的数据包1.3容易丢包1.4可以实现一对多,多对多2.客户端与服务端=发送端与接收端代码框架收数据方一般都是客户端/接收端3.头文件#include<arpa/ine......
  • @Transactional事务注解与函数内多线程并发编程出现的问题
    @Transactional当@Transactional注解写在函数上之后,就表示这个函数开启了事务。事务是基于数据库连接的connect。parallelStream这是针对List进行多线程Stream的操作。//对list集合开启多线程操作list.parallelStream().forEach(item->{//业务代码})@Transactional和pa......
  • 14天Java基础学习——第6天:面向对象编程(类与对象)
    第6天:面向对象编程(类与对象)目标本节的目标是深入理解面向对象编程中的类与对象概念,包括类的定义、对象的创建、构造方法、封装、访问修饰符、this关键字,以及静态与实例成员。通过理论与实践相结合的方式,帮助学生全面把握这些基础概念。1.类与对象的基础1.1类的定义在Ja......