举例:实现compare函数的函数模板、函数模板的特例化、非模板函数、 函数模板的重载。
template<typename T>//函数模板
bool compare(const T a, const T b)
{
cout << "bool compare(const T a, const T b)" << typeid(T).name() << endl;
return a > b;
}
typedef char* CharPtr;
template<>//模板的特例化
bool compare<CharPtr>(const CharPtr a, const CharPtr b)
{
cout << "bool compare<CharPtr>(const CharPtr a, const CharPtr b)" << endl;
return strcmp(a, b)> 0;
}
bool compare(const double a,const double b)//非模板函数
{
cout << "bool compare(const double a,const double b)" << endl;
return a > b;
}
template<typename T>//函数模板的重载
bool compare(const T arr1, int len1, const T arr2, int len2)
{
cout << "bool compare(const T arr1, int len1, const T arr2, int len2)" << endl;
for (int i = 0, j = 0; i < len1&&j < len2; i++, j++)
{
if (arr1[i]>arr2[j])
{
return true;
}
if (i == len1)
{
return false;
}
}
return true;
}
int main()
{
compare(10,20);
compare(10.0, 20.0);
compare("hello", "world");
compare<char *>("hello", "world");
compare("hello", 5, "world", 5);
return 0;
}
执行结果:
举例:类型作为模板类型参数。
实现选择排序的函数模板,排序又分为由大到小和由小到大,可实现其对应的函数模板和模板的特例化,将以上函数模板和模板的特例化,定义为一种类型,作为选择排序函数模板的类型参数。
template<typename T>
bool Mymore(const T a,const T b)
{
cout << "bool Mymore(const T a,const T b)" << typeid(T).name() << endl;
return a > b;
}
typedef char* CharPtr;
template<>
bool Mymore<CharPtr >(const CharPtr a, const CharPtr b)
{
cout << "bool Mymore<CharPtr >(const CharPtr a, const CharPtr b)" << endl;
return strcmp(a, b) > 0;
}
template<typename T>
bool myless(const T a, const T b)
{
cout << "bool myless(const T a, const T b)" << typeid(T).name() << endl;
return a < b;
}
template<>
bool myless<CharPtr >(const CharPtr a, const CharPtr b)
{
cout << "bool myless<CharPtr >(const CharPtr a, const CharPtr b)" << endl;
return strcmp(a, b) < 0;
}
//类型作为模板类型参数
template<typename T,typename PRE>//PRE自动推演出模板类型参数
void Sort(T arr[], int len,PRE pre)
{
cout << "void Sort(T arr[], int len,PRE pre)" << typeid(T).name() << endl;
cout << typeid(PRE).name() << endl;
T tmp;
int i;
for (i = 0; i < len; i++)
{
for (int j = i; j < len; j++)
{
//if (arr[i] > arr[j]) 从小到大
//if (arr[i] < arr[j]) 从大到小
//if (Mymore(arr[i], arr[j]))
///if (myless(arr[i],arr[j]))
if (pre(arr[i], arr[j]))
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
}
int main()
{
int arr[] = { 1, 2,99};
Sort(arr, 3,Mymore<int>);//注意传参方式!!!
for (int i = 0; i < 3; i++)
{
cout << arr[i] << " ";
}
cout << endl;
char *arr2[] = { "aas","frg","dfg" };
Sort<char*>(arr2, 3,myless<char*>);
for (int i = 0; i < 3; i++)
{
cout << arr2[i] << " ";
}
cout << endl;
}
运行结果: