本文参照于狄泰软件学院——《C++深度剖析课程》
问题:之前我们在类模板都是使用泛指类型的。但是当我们需要定义一个模板数组时,不仅仅需要定义数组的类型,还需要指定数组的大小。
而当我们在指定数组大小时,需要指定一个整形数。那么在模板中如何设定呢?
模板参数可以是数值型参数(非类型参数)
template
< typename T, int N >
void func()
{
T a[N]; //使用模板参数定义局部数组
}
func<double, 10>();
数值型模板也有相应的限制。
- 变量不能作为模板参数
- 浮点数不能作为模板参数
- 类对象不能作为模板参数
- 。。。
本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确定。
这跟数组的定义时一样的。数组的大小在编译阶段必须确定。所以并不能使用变量来指定数组的大小。而却数组的大小也不可能是浮点数。
示例代码:数组类模板
#ifndef _ARRAY_H_
#define _ARRAY_H_
template< typename T, int N >
class Array
{
T m_array[N]
public:
int length();
bool set(int index, T value);
bool get(int index, T& value);
T& operator[] (int index);
T operator[] (int index) const;
virtual ~Array();
};
template< typename T, int N >
int Array<T, N>::length()
{
return N;
}
template< typename T, int N >
bool Array<T, N>::set(int index, T value)
{
bool ret = (0<=index) && (index<N);
if( ret )
{
m_array[index] = value;
}
return ret;
}
template
< typename T, int N >
bool Array<T, N>::get(int index, T& value)
{
bool ret = (0 <= index) && (index < N);
if( ret )
{
value = m_array[index];
}
return ret;
}
template
< typename T, int N >
T& Array<T, N>::operator[] (int index)
{
if( (0<=index) && (index<N) )
{
return m_array[index];
}
else
{
throw 0;
}
}
template
< typename T, int N >
Array<T, N>::~Array()
{
}
#endif