在我们以前的印象中,C++中一般的函数接受参数必须首先声明类型,导致函数比较有局限性,无法实现通用参数传入的功能,函数的复用性大大降低,因此C++中提供了STL(标准模板库),这就是泛型编程的思想。而实现泛型编程的函数/类我们称为函数模板/类模板。先看如下代码
#include<iostream>
#include<stdio.h>
using namespace std;
//函数模板->使用关键字template->将类型参数化,提高代码复用性
template<typename T>//typename可以用class代替
void swap(T *p1,T *p2)
{
T temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10;
int b = 20;
swap(&a,&b);//自动类型推导
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
模板使用关键字template,可以使用typename或者class,一般来说函数模板用typename,类模板用class。看个人习惯吧。后面的T是类型变量,自定义。在交换功能的函数中T修饰p1,p2指针类型,然后在main函数中传入整型a和b的地址,注意这里编译器会自动推导出T的类型为int型,当然,你可以显示的说明T为int型,代码如下
#include<iostream>
#include<stdio.h>
using namespace std;
//函数模板->使用关键字template->将类型参数化,提高代码复用性
template<typename T>//typename可以用class代替
void swap(T *p1,T *p2)
{
T temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10;
int b = 20;
swap<int>(&a,&b);//显示声明
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
如果a和b为不同类型呢,像如下的代码,如果b为字型呢这样就报错了,因此要注意类型要保持一致,这个函数,我们可以传入int ,double ,float等众多类型,是不是比一般函数的复用性有很大地提高呢。如果同时有普通函数和函数模板,优先调用普通函数,如图所示
当然,可以通过空模板参数列表,来调用函数模板,如图所示c
除此之外,函数模板也可以发生重载,如下所示
我们来看下类模板,如下代码
#include<iostream>
#include<stdio.h>
using namespace std;
template<class NameType,class AgeType>
class Person
{
public:
Person(NameType name,AgeType age)
{
this->name = name;
this->age = age;
}
NameType name;
AgeType age;
};
int main()
{
Person<string,int> p1 = Person<string,int>("lyp",24);
cout<<p1.age<<endl;
cout<<p1.name<<endl;
return 0;
}
有了函数模板的基础,类模板理解难度不大,值得注意的是类模板没有自动推导类型方式,必须要显示的声明类型,除此之外。类模板在参数模板列表中可以有默认参数,如下所示代码
#include<iostream>
#include<stdio.h>
using namespace std;
template<class NameType ,class AgeInt =int>//在模板参数列表中可以有默认参数
class Person
{
public:
Person(NameType name,AgeInt age)
{
this->age = age;
this->name = name;
}
NameType name;
AgeInt age;
};
int main()
{
Person<string,int> p = Person<string,int>("lyp",25);//类模板中没有自动类型推导方式
return 0;
}
,先溜了。
如果上述代码帮助您很多,可以打赏下以减少服务器的开支吗,万分感谢!


点击此处登录后即可评论