文章目录
- 前言
- 函数模板是什么?
- 函数模板的基础语法
- 一致性要求
- 类模板是什么?
- 类模板的基本语法
前言
模板是cpp中非常重要的内容它极大的解放了我们的精力使我们可以用少量代码写出相对多的内容,而整个模板分为函数模板和类模板下面我将详细介绍它们两个。
提示:以下是本篇文章正文内容,下面案例可供参考
函数模板是什么?
函数模板是C++语言中的一种高级特性,它允许程序员编写与类型无关的函数。这意味着你可以编写一个函数模板,然后在需要时,使用不同的数据类型作为参数或返回类型,而无需为每种数据类型都编写一个新的函数。
函数模板的基本思想是:将函数中的数据类型定义为参数,这个参数在函数模板实例化时才会被具体的数据类型所替换。这样,通过模板参数化,可以大大提高代码的重用性和灵活性。
函数模板的基础语法
函数模板使得你可以编写一个通用的函数,该函数能够处理不同数据类型的参数。它允许你在编写函数时不必指定具体的类型,而是使用一个虚拟的类型占位符(通常用T(type)表示),这个占位符将在函数调用时由实际参数的类型来确定
它的主体和关键字如下
template <typename T> // 或者使用 class 关键字代替 typename
returnType functionName(parameter list) { // 函数体
}
在其中template是取代实例化的关键字,在它后面加(T可以随意变成任何东西具体含义看你的使用)它可以定义多个替代字符只需要在后面加逗号和新的typename就行了举一个例子:
template<class T,typename Y,typename H,class U>
在这里定义了T,Y,H,U,这几个替代符其中class和typename是一样的(严格来说是不同的但在这里可以看成一样的)
而用它写函数也很简单将寻常函数写下将你想要替换的改成T就行了,这极大的方便了我们的代码在这里我就举一个例子:你写一个简单的两数相加的add函数要有多少个?int,char,double…更别说它们的相互结合(还好还可以写同名字的c语言更麻烦)而我们用了函数模板后就可以只写一个就行了剩下的就交给编译器
#include <iostream>
using namespace std; // 函数模板声明
template <typename T,class Y>
void add(T a, Y b) { cout <<a+b<<endl;
} int main() { add(8,9);add(8.1,9);add('y',9);add('y','u');return 0;
}
当然如果你写了一个add(int ,int)你再调用add(8,9)它会优先用现成的add(int,int)因为函数模板的本质就是编译器识别关键字然后创建相应函数 如果有现成的它会优先使用
一致性要求
所有能够参与推导的实参必须推导出相同的类型,否则推导失败。例如,如果模板函数有两个参数,且这两个参数都用于推导同一个模板参数,那么这两个实参的类型必须一致。 简单来说就是对T定义之后就不能再定义了(比如你将T定义为int你就不能再改变了)
类模板是什么?
类模板(Class Template)是C++中一种强大的特性,它允许程序员编写与类型无关的代码。通过使用模板,你可以定义一个类,其成员函数的实现可以推迟到类被实例化时指定具体类型之后。这样,你就可以编写一个通用的类,它可以用于多种数据类型,而无需为每种数据类型都编写一个单独的类。
类模板的定义以template< typename T>(在C++11及以后版本中也可以使用class代替typename,两者在这个上下文中可以互换)开始,后面跟着模板参数列表(可以有一个或多个参数),然后是类的定义。模板参数在类的定义中用作占位符,表示在实例化类时将要使用的具体类型。
类模板的基本语法
类模板使得你可以编写一个通用的类,该类能够处理不同数据类型的参数。它允许你在编写函数时不必指定具体的类型,而细节与函数模板有很多相似处,它的主体和关键字如下
#include <iostream>
using namespace std;
template<typename T>
class Box {
private:T value;
public:
};
int main()
{Box <int>a;}
在这里我们要先定义出我们想要的类内容比如int我们就在类名前加入 < int>让类能够顺利定义(编译器会自动生成相应的类不定义生成不了),通过类模板,可以编写出既灵活又高效的代码,同时避免了代码的重复。C++标准库中的许多容器(如std::vector、std::map等)和算法都是基于模板实现的,这证明了类模板在C++编程中的重要性。
因为函数模板的细节和类模板的细节类似我在这里再写的化也显得重复啰嗦,具体还是得自己写一下模板才行,但是还是建议平时多写模板比较可以苦苦编译器但是别苦了自己嘛。