函数模板
template <class identifier> function_declaration; template <typename identifier> function_declaration;
//method.cpp文件
template<typename T> T sum_1(T& a, T& b)
{
return a + b;
}
//method.h文件
#ifndef _method_
#define _method_
#include "method.cpp"
#endif
//main.cpp文件
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<numeric>
#include<vector>
#include<stack>
#include<bitset>
#include<algorithm>
#include<iomanip>
#include<set>
#include<map>
#include<stdio.h>
#include "method.cpp"
using namespace std;
int num1 = 1, num2 = 2;
double c = 2.5, d = 4.5;
int main() {
printf("sum:%d\n", sum_1<int>(num1, num2));
printf("sum:%0.2f\n", sum_1<double>(c, d));
return 0;
}
类模板 和 模板参数
原因:类的函数定义不能放在stack.cpp中,必须放在stack.h(类的函数声明和定义放在同一个文件下)中,否则模板不会被识别。
template<class T, T def_val> class Stack{...}
上述类模板的栈有一个限制,就是最多只能支持100个元素,我们可以使用模板参数配置这个栈的最大元素数,如果不配置,就设置默认最大值为100,代码如下:
//statck.h
#ifndef _stack_
#define _stack_
template<class T, int maxsize = 100> class Stack
{
public:
Stack();
~Stack();
void push(T x);//入栈没有返回函数
T pop();//返回的是出栈的数值
bool isEmpty();
private:
T* m_pT;
int maxSize;
int m_size;
};
//stack.cpp函数声明,因为报错,所以放在头文件里面
template<class T, int maxsize> Stack<T, maxsize>::Stack()
{
maxSize = maxsize;
m_size = 0;
m_pT = new T[maxSize];
}
template<class T, int maxsize> Stack <T, maxsize>::~Stack()
{
delete[] m_pT;
}
template<class T, int maxsize> void Stack <T, maxsize>::push(T t)
{
m_size++;//栈的长度加1
m_pT[m_size - 1] = t;//入栈
}
template<class T, int maxsize> T Stack <T, maxsize>::pop()
{
T t = m_pT[m_size - 1];//拿到最后的数值
m_size--;//出栈
return t;
}
template<class T, int maxsize> bool Stack <T, maxsize>::isEmpty()
{
return m_size == 0;
}
#endif
//main.cpp
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<numeric>
#include<vector>
#include<stack>
#include<bitset>
#include<algorithm>
#include<iomanip>
#include<set>
#include<map>
#include<stdio.h>
#include "stack.h"
using namespace std;
int main()
{
int maxsize = 50;
Stack<int, 50> intStack;//这个写法要记住
for (size_t i = 0; i < maxsize; i++)
{
intStack.push(i);
}
while (!intStack.isEmpty())
{
printf("%d\n", intStack.pop());
}
return 0;
}
模板专门化
//vector.h
#ifndef _vector_
#define _vector_
template<class T> class compare
{
public:
bool equal(T t1, T t2);
};
template<>class compare<char*>//template中如果有特例,需要重新定义一下
{
public:
bool equal(char* t1, char* t2)
{
return strcmp(t1, t2) == 0;
}
};
//vector.cpp函数声明,因为报错,所以放在头文件里面
template<class T> bool compare<T>::equal(T t1, T t2)
{
return t1 == t2;
}
#endif /*vector*/
//main.cpp
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<numeric>
#include<vector>
#include<stack>
#include<bitset>
#include<algorithm>
#include<iomanip>
#include<set>
#include<map>
#include<stdio.h>
#include "vector.h"
using namespace std;
char str1[] = "hello!", str2[] = "hello!";
int main()
{
compare<int> c1;
compare<char> c2;
cout << c1.equal(1, 1) << endl;
cout << c2.equal(*str1, *str2) << endl;
return 0;
}