c++模板学习笔记

函数模板

函数模板的格式为:

template<typename T1,typename T2...>
函数返回值类型 函数名(参数列表)
{
   
	//函数体
}

typename是定义模板参数的关键字,可以使用class来代替(不能使用struct)

函数模板本身并不是函数,在编译阶段,编译器通过用户传参自动识别参数类型,从而推导出模板函数参数列表的类型,得到一个函数供用户使用,这样就可以通过用户传递的参数类型的不同,得到一批仅仅只是类型不同的函数,相当于把重复做的事情交给了编译器,从而提升了开发效率。
当编译器对同一typename推到出不同类型时会出错:

template<typename T>
void swap(T& num1,T& num2)
{
   
	T temp=num1;
	num1=num2;
	num2=temp;
}

int main()
{
   
	int num1=1;
	float num2=2.0;
	swap(num1,num2);//T被推导出不同的类型,出错
}

类似于上面的swap函数由编译器自动推导typename的类型的称为隐式实例化,还有一种实例化方式为显式实例化:

函数名 <指定类型>(参数)

有些场景只能使用显式实例化

template<typename T>
T* fun(int n)//所有参数已经是特定类型
{
   
	return (T*)malloc(n);
}

int main()
{
   
	int n=100;
	int*p=fun<int>(n);//显式实例化
	
	return 0
]

要注意在显式实例化中<>里面的类型个数要与template的<>中的typename的个数相同,同时是自左向右依次匹配typename的类型。

模板参数匹配原则:
①一个非模板函数与一个同名的模板函数同时存在,且该模板函数可以实例化出这个非模板函数时,优先使用非模板函数。


int Sum(int num1, int num2)
{
   
	cout << "非模板函数" << endl;
	return 0}

template<typename T1,typename T2>
int Sum(T1 num1, T2 num2)
{
   
	cout << "模板函数" << endl;
	return 0;
}
int main()
{
   
	int num1=1;
	int num2=2;
	Sum(num1, num2);//优先使用非模板函数
	Sum<int, int>(num1, num2);//使用模板函数

	return 0;
}

②当非模板函数参数类型不匹配,而模板可以实例化出一个参数更匹配的函数时,优先使用模板实例化函数

int Sum(int num1, int num2)
{
   
	cout << "非模板函数" << endl;
	return 0;
}

template<typename T1,typename T2>
int Sum(T1 num1, T2 num2)
{
   
	cout << "模板函数" << num2<<endl;
	return 0;
}
int main()
{
   
	int num1=1;
	float num2=2.0;//浮点型
	Sum(num1, num2);//优先使用模板实例化函数

	return 0;
}

总的来说就是哪个参数更匹配就优先使用哪个,如果两个参数都匹配就优先使用现成的(非模板函数)。

类模板

类模板的定义格式为:

template<class T1,class T2...>
class 模板类类名
{
   
	//类体
};//注意这里有分号

模板类的成员函数的声明和定义分离时,形式如下:

template<class T>
class MyVector
{
   
public:
	viod fun1();//函数声明
private:
	//...
};

//函数定义
template<class T>
void MyVector<T>::fun()//注意返回值类型的位置
{
   
	//...
}

模板类的实例化格式为:

模板类类名<数据类型> 类名

模板类的类名不是真正的类,而实例化才是真正的类

MyVector<int> s;
//实例化出一个类后,利用该类实例化出一个对象s

需要注意的是类模板不能将声明和定义分离到两个文件中。

相关推荐

  1. c++模板学习笔记

    2023-12-11 07:36:02       49 阅读
  2. C++学习笔记九--模版

    2023-12-11 07:36:02       33 阅读
  3. C++学习笔记(三十一):c++ 模板template

    2023-12-11 07:36:02       51 阅读
  4. 2020.9.8C++Primer学习笔记————模板函数

    2023-12-11 07:36:02       42 阅读
  5. C++20实践入门之类模板学习笔记

    2023-12-11 07:36:02       33 阅读
  6. C++20设计模式学习笔记---原型模式

    2023-12-11 07:36:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-11 07:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-11 07:36:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-11 07:36:02       82 阅读
  4. Python语言-面向对象

    2023-12-11 07:36:02       91 阅读

热门阅读

  1. 跨境电商运营常用的ChatGPT通用提示词模板

    2023-12-11 07:36:02       58 阅读
  2. 基于深度学习的文本分类研究综述

    2023-12-11 07:36:02       54 阅读
  3. 【计算机网络】期末复习第一章

    2023-12-11 07:36:02       62 阅读
  4. uniapp 蓝牙小程序

    2023-12-11 07:36:02       57 阅读
  5. 力扣面试150题 | 买卖股票的最佳时期

    2023-12-11 07:36:02       64 阅读
  6. 《C++20设计模式》学习笔记---单例模式

    2023-12-11 07:36:02       40 阅读
  7. 私有云集成 iOS IMKit 5.X 源码的解决方案

    2023-12-11 07:36:02       66 阅读