函数模板 : 就是允许编写依次函数定义然后用于不同数据类型,而不用每种类型单独编写函数
( 可以类比C语言中的宏定义来对比认知 )
使用 template 关键字进行模板定义
#include <iostream>
#include <string>
using namespace std;
const int ARRAY_LEN = 10;
template <typename T>
/* 或者 template <class T> (typename 和 class 在模板定义中是等价的)
* T : 函数中数据类型可以是 T; 即该模板参数
* [注意!!!] 在template语句与函数模板定义语句之间不允许插入别的语句
*/
T getArrayMaxValue(T* array, int size)
{
cout << "模板重载函数 1 调用" << endl;
T max = array[0];
for (size_t i = 1; i < size; i++)
{
if (max < array[i]) {
max = array[i];
}
}
return max;
}
// 和一般函数一样,函数模板也可以重载
template <class T>
T getArrayMaxValue(T* array, int size, int second)
{
cout << "模板重载函数 2 调用" << endl;
T max = array[0];
for (size_t i = 1; i < size; i++)
{
if (max < array[i]) {
max = array[i];
}
}
return max;
}
// 函数模板与同名的非模板函数也可以重载。
// (调用顺序: find非模板函数,找到则调用,没有找到则find函数模板,实例化产生一个匹配的模板参数)
int getArrayMaxValue(int* array, int size, int second)
{
cout << "非模板函数调用" << endl;
int max = array[0];
for (size_t i = 1; i < size; i++)
{
if (max < array[i]) {
max = array[i];
}
}
return max;
}
类模板 : 与函数模板类似,就是创建一个通用类,可以实例化各种数据类型
template <class T>
class MyStack
{
public:
MyStack()
{
}
~MyStack()
{
}
void myStackInit(void)
{
top = 0;
}
void myStackPush(T element)
{
if (top == ARRAY_LEN)
{
cout << "栈空间元素已满,入栈失败" << endl;
return;
}
stack[top++] = element;
}
T myStackPop()
{
if (0 == top)
{
cout << "栈空间元素为空,出栈失败" << endl;
return 0;
}
return stack[--top];
}
void display()
{
for (size_t i = 0; i < top; i++)
{
cout << "stack[" << i;
cout << "] = " << stack[i] << endl;
}
}
private:
T stack[ARRAY_LEN];
int top;
};
函数模板和类模板测试代码 :
void templateTest()
{
int* value_p = new int[10] {
1,2,6,7,3,67,23,78,56,45
};
cout << "value_p max vlaue = " << getArrayMaxValue(value_p, ARRAY_LEN) << endl;
double* value_p1 = new double[10] {
1.4, 2.9, 2.8, 3.8, 38.7, 67.0, 2.3, 78.9, 56.8, 1.8
};
cout << "value_p1 max vlaue = " << getArrayMaxValue(value_p1, ARRAY_LEN, 0) << endl;
cout << "value_p max vlaue = " << getArrayMaxValue(value_p, ARRAY_LEN, 0) << endl;
delete[] value_p;
delete[] value_p1;
cout << "\r\n测试类模板...................\r\n" << endl;
MyStack<string> mystack;
mystack.myStackInit();
mystack.myStackPush("小白");
mystack.myStackPush("小黑");
mystack.myStackPush("小绿");
mystack.myStackPush("小黄");
mystack.myStackPush("小紫");
mystack.myStackPush("小蓝");
mystack.myStackPush("小青");
mystack.myStackPush("小棕");
mystack.myStackPush("小马");
mystack.myStackPush("小牛");
mystack.myStackPush("小狗");
mystack.myStackPop();
mystack.myStackPop();
mystack.myStackPop();
mystack.myStackPop();
mystack.myStackPop();
mystack.myStackPop();
mystack.myStackPop();
mystack.display();
}
运行结果 :