C++ --- template

本文介绍了如何在C++中使用模板(函数模板和类模板)来避免针对不同类型的函数重载,通过模板实现实例化,减少代码冗余。作者还解释了模板的隐式和显式实例化,并说明了模板优先级于非模板函数的调用规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大家在实际写代码中比如要针对不同类型的交换例如swap,需要重载不同类型的swap来进行使用,每次都要去写一个重载的swap,这样很麻烦,代码的重复量也大,那有什么办法可以解决呢?

那么这样就引出了我们今天的主角template,也就模版,模版大家应该都知道什么意思吧,这就相当于印刷书籍的那个模子,或者是做相同形状的饼干所要用到的一个模具。模版主要分为函数模版和类模版,具体用法如下:

#include <iostream>
using namespace std;



template<class T>
//template<typename T>
//上面两种写法都可以,最好就是用class,这个用的比较多
//T这个是取的一个变量名字(你可以随便取,但是我推荐都取T,T正好对应typename的首字母)
void Swap(T& x1, T& x2)//这个&是引用,用于减少传参时的拷贝,也可以不加,加了最好
{
    T x = x1;
    x1 = x2;
    x2 = x;
}

int main()
{
    int a = 1, b = 2;
    double d1 = 10.0, d2 = 20.0;
    Swap(a, b);
    Swap(d1, d2);
    rerturn 0;
}

 这里是函数模版,通过这个模版可以实例化生成对应类型的函数,注意这里不是调的不是函数模  版哦,函数模版会在编译之前,先生成对应类型的函数,也就是真正调用的是Swap(int& x1, int& x2)和Swap(double& x1, double& x2)这两个函数,其实实际上还是两个函数,只不过这两个函数不用我们自己写,编译器会通过这个模版以及传过来的参数的类型去推导这个T的类型,然后实例化生成对应的函数。

然后接下来讲另外一种用法就是类模版,类模版也是用来解决C语言中处理不了的问题,比如想同时定义两个栈,一个栈存int,一个栈存double,C语言是做不到的,而C++通过这个类模版可以解决,具体代码如下:

template<class T>
class Stack_CPP
{
public:
	Stack_CPP()
	{}
	~Stack_CPP()
	{}
	void Push(T x)
	{}
private:
	T* _a;
	int _size;
    int _capacity;
};

int main()
{
    Stack_CPP<int> st1;
    Stack_CPP<double> st2;
    return 0;
}

这里就是用的时候需要加一个<类型>,用于指定T的类型。像这里这种用法就是显式实例化,上面那个函数模版就是隐式实例化1,一个是编译器自己推导,一个是我们自己指定。注意:如果同时出现模版和非模版函数,就比如函数名都是AAdd,那么在调用的时候会怎么调呢,会优先调非模版的。这就好比日常生活中有现成的饭菜和点外卖,你会选择哪一个一样,有现成的肯定是现成的,没有现成的我们才会去点外卖或者自己做。编译器也是这样,调非模版的不需要特化,也就是少做了一步事情,肯定是快一点也省事。

以上就是template的两种用法了,如果本文章对你有帮助,请点赞收藏支持一下,如果有问题,可在下方评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值