模板参数可以是某些类型或者非类型。类型参数需用使用typename或class关键字才指定。
如下:
template<typename T1,typename T2,...> class className{...}
template<class T1, class T2,...> class className{...}
非类型的参数就是通常的参数定义,表示模板在实例化时所是用的常量。
还是以数组模板类为例子:
#include <iostream>
using namespace std;
template <typename T = int, int len = 10>
class Array
{
public:
Array();
~Array();
int length() const {
return m_length;
}
T& get(int index) const;
T operator[](int index);
private:
T *p_array;
int m_length;
};
template <typename T,int len>
Array<T,len>::Array():
p_array(new T[len]),
m_length(len)
{
}
template <typename T,int len>
Array<T,len>::~Array()
{
delete p_array;
}
template <typename T,int len>
T& Array<T,len>::get(int index) const
{
if (index > m_length -1) {
throw "ERROR:index is out!";
} else {
return p_array[index];
}
}
template <typename T,int len>
T Array<T,len>::operator[](int index)
{
return p_array[index];
}
int main()
{
Array<> intArr;
cout << "the length of int array is " << intArr.length() << '\n';
try {
intArr.get(11);
}catch(const char *ex) {
cout << ex << '\n';
}
Array<char> charArr;
Array<char,20> char20Arr;
cout << "the length of char20 array is " << char20Arr.length() << '\n';
return 0;
}