数组类模板

  • 模板参数可以是数值型参数(非类型参数)
template <typename T,int N>
void func()
{
    //使用模板参数定义局部数组
    T a[n];
}
  • 数值型模板参数的限制
  1. 变量不能作为模板参数
  2. 浮点数不能作为模板参数
  3. 类对象不能作为模板参数
  4. 本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确认。
  • 有趣的题目:使用最高效的方法求1+2+3+4+...+N的值!
  • 答案
#include <iostream>

#include <string>
using namespace std;
template
<int N>
class Sum
{
public:
    static const int value = Sum<N - 1>::value + N;
};
template
<  >
class Sum <1>
{
public:
    static const int value = 1;
};
int main()
{
    cout << "1+2+3+4+....+100=" << Sum<100>::value << endl;
}
  • 数组类模板范例程序
mian.cpp
#include <iostream>
#include <string>
#include "Array.h"
using namespace std;
int main()
{
     Array<int, 5> array;
    for (int i =0;i<array.length();i++)
    {
        array.operator[](i)= i * i;
    }
    for (int i =0;i<array.length();i++)
    {
        cout << array[i] << endl;
    }
    return 0;
}
Array.h
#ifndef _ARRAY_H_
#define _ARRAY_H_
template <typename T,int N>
class Array
{
        T m_value[N];
public:
        int   length();
        bool get_value(int index,T& value) ;
        bool set_value(int index,T value);
        //这个地方需要注意:如果数组类对象要做左值,需要返回一个引用,因为函数调用不能做左值
        //例:  
        //Array<int, 5> array;
        //array.operator[](2)= 3;
        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>::get_value(int index, T& value)
{
        bool ret = (0 <= index) && (index <= N);
        if (ret)
        {
               value = m_value[index];
        }
        return ret;
}
template <typename T, int N>
bool Array<T, N>::set_value(int index, T value)
{
        bool ret = (index >= 0) && (index < N);
        if (ret)
        {
               m_value[index] = value;
        }
        return ret;
}
template <typename T, int N>
T& Array<T, N>::operator[] (int index)
{
        return m_value[index];
}
template <typename T, int N>
T Array<T, N>::operator[] (int index) const
{
        return m_value[index];
}
template <typename T, int N>
Array<T, N>::~Array()
{
}
#endif
  • 小结
  1. 模板参数可以是数值型参数
  2. 数值型参数必须在编译期间唯一确认
  3. 数组类模板是基于数值型模板实现的
  4. 数组类模板是简易的线性表数据结构
 
 
主要记录的是学习听课的笔记
原文地址:https://www.cnblogs.com/chengeputongren/p/12283654.html