C++模板——数组类模板

本文参照于狄泰软件学院——《C++深度剖析课程》

问题:之前我们在类模板都是使用泛指类型的。但是当我们需要定义一个模板数组时,不仅仅需要定义数组的类型,还需要指定数组的大小。
而当我们在指定数组大小时,需要指定一个整形数。那么在模板中如何设定呢?

模板参数可以是数值型参数(非类型参数)

template
< typename T, int N >
void func()
{
  T a[N];          //使用模板参数定义局部数组
}
func<double, 10>();

数值型模板也有相应的限制。

  1. 变量不能作为模板参数
  2. 浮点数不能作为模板参数
  3. 类对象不能作为模板参数
  4. 。。。

本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确定。
这跟数组的定义时一样的。数组的大小在编译阶段必须确定。所以并不能使用变量来指定数组的大小。而却数组的大小也不可能是浮点数。

示例代码:数组类模板

#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

猜你喜欢

转载自blog.csdn.net/small_prince_/article/details/80533118