一、概念:
所谓模板,通俗的理解就是像模具一样,通过它就能做出东西,一般是样式啥都是固定的,就像所谓的作文模板那样,能用的上就直接拿过来添加点自己的东西。那就是自己的。(我是这样理解的)
但在编程中,模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式,模板分为模板函数和模板类。
二、模板函数
举个例子:(假设要实现一个比较两个数是否相等的重载函数)
bool isEqual(int left,int right) //第一个函数
{
return left == right;
}
bool isEqual(const string& left,const string& right) //第二个函数
{
return left == right;
}
void test()
{
string s1("s1"),s2("s2");
cout<<isequal(s1,s2)<<endl; //调第二个函数
cout<<isequal(1,1)<<endl; // 调第一个函数
}
int main()
{
test();
return 0;
}
以上两个函数是重载函数;所谓重载函数(a、函数名相同,b、函数有不同的参数或函数有不同的参数类型。)
三、函数模板的格式
template <class 形参名1,class 形参名2 class 形参名n)
返回类型 函数名 (参数列表)
{...}
模板形参的定义既可以使用class,也可以用typename,含义是相同的。
下面定义一个模板函数:
template<typename T>
bool IsEqual(const T&left,const T&right)
{
return left == right;
}
void test()
{
string s1("s1"),s2("s2");
cout<<IsEqual(s1,s2)<<endl;
cout<<IsEqual(1,1)<<endl;
}
此时编译器会根据传递的参数自动推演出模板形参的类型,并自动生成对应的代码。
四、模板参数的匹配和实列化问题
上例看似很方便很完美但是其实并非如此,想一想如果所传递的参数的类型不同,那么编译器会如何做出抉择呢?
看看下面的例子:如果我把test改成如下,上述模板还有效吗?
void test()
{
cout<<IsEqual(1,1)<<endl; //参数相同 可以使用上述模板
cout<<IsEqual(1,1.1)<<endl; //参数不同 编译器 如何抉择???
}
如果遇到上面第二种情况时,我们这样写:
cout<<IsEqual<int>(1,1.1)<<endl;先指定一个类型另一个类型让编译器去抉择;