函数模板和模板函数
同前面的指针函数和函数指针类似,函数模板和模板函数也具有相似的关系,函数模板是一个模板,模板函数是由函数模板所产生的函数。函数模板需要使用关键字template来声明。
#include<iostream>
#include<stdio.h>
using namespace std;
//声明函数模板
template<typename T>
void add(T x, T y)
{
cout << x + y << endl;
}
//一个全特化的函数模板
template<>
void add<const char *>(const char * x, const char * y)
{
printf("%s %s", x, y);
}
int main()
{
//由函数模板产生模板函数
add<int>(5, 2);
add<float>(5.2, 2.5);
add<const char*>("hello", "world\n");
system("pause");
return 0;
}
函数模板的全特化
函数模板的全特化,是函数模板的一种特殊情况,在该情况下,不需要指明模板函数的参数,而是直接将函数模板给出一个固定的值。就如上面的代码中,实现的功能。
类模板
&emsp;类模板就是对类的进一步抽象,和函数模板类似,完成类模板后,只需指定参数,就能完成生成模板类,一个模板类只能在头文件中实现。
头文件
#pragma once
template<class T>
class Rect
{
public:
T get_data(int idx);
T arr[10];
};
template<class T>
T Rect<T>::get_data(int idx)
{
return arr[idx];
}
主函数
#include<iostream>
#include<stdio.h>
#include "Rect.h"
using namespace std;
template<typename T>
void add(T x, T y)
{
cout << x + y << endl;
}
template<>
void add<const char *>(const char * x, const char * y)
{
printf("%s %s", x, y);
}
int main()
{
add<int>(5, 2);
add<float>(5.2, 2.5);
add<const char*>("hello", "world\n");
Rect<int> R1;
for (size_t i = 0; i < 10; i++)
{
R1.arr[i] = i;
}
cout << "get_data is " << R1.get_data(5) << endl;
system("pause");
return 0;
}
类模板的全特化和偏特化
类模板的全特化和偏特化与函数模板的全特化类似。并且类模板可以继承自类模板。