模板的编译
一个模板参数列表只和一个函数模板相对应。因此每定义一个函数模板就需要重新定义一个模板参数列表
//定义模板以及一个函数模板
template <typename T>
int compare(const T &v1, const T &v2);
int main()
{
compare(1, 2); //模板函数,也称为模板的实例化
compare("ABC","DEF");//模板函数
return 0;
}
//定义模板以及一个函数模板
template <typename T, class U>
int compare(const T &v1, const U &v2);
int main()
{
compare(1, 1); //T为int,U也为int
compare(1,"DEF"); //T为int,U也为string
return 0;
}
//定义模板以及一个函数模板。template <unsigned N, unsigned M>int compare(const char(&p1)[N], const char(&p2)[M])//传入数组的引用来比较数组大小{return strcmp(p1, p2);}int main(){compare("hi","mom");//编译器会使用字面值常量的大小来代替N和Mreturn 0;}
template<typename T> //正确inline T func(T const&);constexpr template<typename T> //错误,constexpr位置错误T func2(T const&);
template <typename T>int compare(const T& s1, const T& s2){if (v1 < v2)return -1;if (v1 > v2)return 1;return 0;}
template <typename T>int compare(const T& s1, const T& s2){if (less<T>()(v1,v2))return -1;if (less<T>()(v2, v1))return 1;return 0;}
前方高能,我来出一个代码例子,来看看结果和你想的是否一致?
练习:
#include <iostream>
#include <cstring>
using namespace std;
template<typename T1,typename T2>
bool Compare(const T1& t1,const T2& t2)
{
cout << "call Compare(const T1& t1,const T2& t2)" << endl;
if(t1 > t2){
return true;
}
return false;
}
bool Compare(const char* s1,const char* s2)
{
cout << "call Compare(const char* s1,const char* s2)" << endl;
return strcmp(s1,s2);
}
bool Compare(const float& t1,const float& t2)
{
cout << "call Compare(const float& t1,const float& t2)" << endl;
if(t1 > t2){
return true;
}
return false;
}
int main(){
int a = 12,b=23;
Compare(a,b);
const char *p = "11111";
const char *q = "00";
Compare(p,q);
float c=12.0,d=15.7;
Compare(c,d);
return 0;
}
为什么结果是
call Compare(const T1& t1,const T2& t2)
call Compare(const char* s1,const char* s2)
call Compare(const float& t1,const float& t2)
呢?接下来就是我们下一节要讲的模板的特化。