首页 > 其他分享 >函数模版和类模版

函数模版和类模版

时间:2024-07-03 10:29:40浏览次数:10  
标签:函数 int 模版 编译器 实例 类型 模板

函数模板

函数模板概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本

函数模板格式

.1 函数模板格式

template<typename T1, typename T2,......,typename Tn>

返回值类型 函数名(参数列表){}

template<typename T>
 void Swap( T& left,  T& right) 
{    T temp = left;   
     left = right;

     right = temp;
}

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

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

函数模板的实例化

用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。

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

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类型而报错
注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅    
    Add(a1, d1);  
// 此时有两种处理方式:1. 用户自己来强制转化 2. 使用显式实例化
    Add(a1, (int)d1);
   return 0;
}

显式实例化:在函数名后的<>中指定模板参数的实际类型

int main(void)
 {
    int a = 10;
    double b = 20.0;
    
    // 显式实例化
    Add<int>(a, b);
    return 0;
 }

如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

重要例子

错误示例:

template<class T>
T add(T&left,T&right)
{
    return left+right;
}
int main()
{
    int a=1;
    double b=2.0;
    add(a,(int)b);   
}

这里面的b会传不过去,因为强制类型转换会产生临时变量(有常性),不可修改所以要在接收b处加一个const

类模版

类模板的定义格式 

template<class T1, class T2, ..., class Tn> 

class 类模板名

{
 // 类内成员定义

};

动态顺序表

注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具

template<class T>

class Vector

{ 

public :
 Vector(size_t capacity = 10)
 : _pData(new T[capacity])
 , _size(0)
 , _capacity(capacity)
 {}
 
 // 使用析构函数演示:在类中声明,在类外定义。

 ~Vector();
 
 void PushBack(const T& data);

 void PopBack();

 // ...

 
 size_t Size() {return _size;}
 
 T& operator[](size_t pos)
{
 assert(pos < _size);
 return _pData[pos];
 }
 

private:
 T* _pData;
 size_t _size;
 size_t _capacity;
};

注意:类模板中函数放在类外进行定义时,需要加模板参数列表

template <class T>

Vector<T>::~Vector()
{
 if(_pData)
 delete[] _pData;
 _size = _capacity = 0;
}

类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

Vector类名,Vector<int>才是类型 
Vector<int> s1; 
Vector<double> s2;

标签:函数,int,模版,编译器,实例,类型,模板
From: https://blog.csdn.net/2401_83427936/article/details/140079458

相关文章

  • 【C++】多态(定义、虚函数、重写、隐藏)
      ......
  • JAVA函数式编程
    函数式编程概念,JAVA八新特性Lambda表达式和流(Stream)的使用。一、基本概念命令式编程:是一种描述计算机所需作出的行为的编程典范。主要思想是关注计算机执行的步骤,计算机则会严格遵循指令。  传统的硬件运行的机器码指令就是以命令式分格编写的。也就是对于需要实现的......
  • 【hash】hash算法、hash函数、哈希表、布隆过滤器、一致性哈希
    哈希函数的基本性质函数定义域是无穷的,值域相对有限(但也很大,比如2的64次方)输入同样样本一定得到同样的输出输入不同样本可能得到相同输出,此时叫哈希碰撞输入大量不同的样本,得到大量输出值,会几乎均匀的分布在整个输出域上布隆过滤器通过几个不同哈希函数计算哈希值,对位......
  • 请编写函数fun,该函数的功能是:统一一含字符串中单词的个数,作为函数值返回。一行字符串
    /请编写函数fun,该函数的功能是:统一一含字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格格开,一行的开始没有空格。/#include<stdio.h>#include<time.h>#include<stdlib.h>#defineN200intfun(char*buff)......
  • Python 引用不确定的函数
    在Python中,引用不确定的函数通常意味着我们可能在运行时才知道要调用哪个函数,或者我们可能想根据某些条件动态地选择不同的函数来执行。这种灵活性在处理多种不同逻辑或根据不同输入参数执行不同操作的场景中非常有用。以下是如何实现这一点的详细介绍和具体代码示例。1.Python......
  • 【C++ | 继承】|概念、方式、特性、作用域、6类默认函数
    继承1.继承的概念与定义2.继承的方式2.1继承基本特性2.2继承的作用域2.2.1隐藏赋值兼容派生类的创建和销毁构造函数拷贝构造赋值重载1.继承的概念与定义继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。在软件......
  • 请编写函数fun,该函数的功能使:统计各年龄段的人数。N个年龄通过调用随机函数获得, 并放
    /请编写函数fun,该函数的功能使:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要求函数把0至9岁年龄段的人数放在d[0]中,把10至19岁年龄段的人数放在d[1]中,把20至29岁的人数放在d[2]中,其余以此类推,把100岁(含100以上年龄的人数都放在d[10]中。结果在主......
  • 请编写函数fun,该函数的功能是:删去一维数组中所有相同的数, 使之只剩一个。数组中的数已
    /请编写函数fun,该函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数/#include<stdio.h>intfun(intarr[],intsize){if(size==0){return0;}inti,j=0;for......
  • 类和对象-友元-全局函数做友元
    全局函数做友元#include<iostream>usingnamespacestd;classBuilding{ //goodGay全局函数是Building好朋友,可以访问Building的私有成员 friendvoidgoodGay(Building*building);public: Building() { m_SittingRoom="客厅"; m_BedRoom="卧室"; }......
  • 前端实现根据模版导出word【docxtemplater】
    场景有的时候我们需要根据后端提供的数据,然后结合word模版来生成word。我们可以使用第三方库docxtemplater效果依赖说明1、docxtemplater:这个插件可以通过预先写好的word,excel等文件模板生成对应带数据的文件2、pizzip:这个插件用来创建,读取或编辑.zip的文件(同步的,还有一个......