模板一般分为模板函数和类模板。
模板函数的一般形式为:
template<类型形参表> 返回值类型 函数名(参数列表){函数体}
类模板的一般形式为:
template<类型形参表> class 类名 {类声明体}
类中成员函数的类外实现的形式
template<类型形参表> 返回值类型 类名<类型名表>::成员函数名(参数列表) {函数体}
下面以数组模板类为例
#include <iostream>
using namespace std;
template <typename T>
class Array
{
public:
Array(int size = 10);
~Array();
T operator[](int index);
T& get(int index) const;
int length() const {
return m_len;
}
private:
Array(const Array&);
Array& operator ==(const Array&);
T *p_array;
int m_len;
};
template<typename T>
Array<T>::Array(int size):
p_array(new T[size]),
m_len(size)
{
}
template<typename T>
Array<T>::~Array()
{
delete p_array;
}
template<typename T>
T Array<T>::operator[](int index)
{
return p_array[index];
}
template<typename T>
T& Array<T>::get(int index) const
{
if (index > m_len -1 ) {
throw "ERROR:index is out!";
} else {
return p_array[index];
}
}
int main()
{
Array<int> intArr;
cout << "length of int array is " << intArr.length() << '\n';
try{
intArr.get(11);
}catch(const char *ex) {
cout << ex << '\n';
}
intArr.get(0) = 2;
cout << "elems of int array is ";
for (int i = 0; i < intArr.length();++i) {
cout << intArr[i] << '\t';
}
cout << '\n';
Array<char> charArr(5);
cout << "length of cahr array is " << charArr.length() << '\n';
try{
charArr.get(11);
}catch(const char *ex) {
cout << ex << '\n';
}
charArr.get(4) = 'Z';
cout << "elems of char array is ";
for (int i = 0; i < charArr.length();++i) {
cout << charArr[i] << '\t';
}
return 0;
}
结果:
使用模板一般都是逻辑相同,类型不同。
模板函数在实例化时以函数重载来体现都是在编译期完成。