-
模板参数可以是数值型参数(非类型参数)
template <typename T,int N> void func() { //使用模板参数定义局部数组 T a[n]; }
-
数值型模板参数的限制
-
变量不能作为模板参数
-
浮点数不能作为模板参数
-
类对象不能作为模板参数
-
本质:模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确认。
-
有趣的题目:使用最高效的方法求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
-
小结
-
模板参数可以是数值型参数
-
数值型参数必须在编译期间唯一确认
-
数组类模板是基于数值型模板实现的
-
数组类模板是简易的线性表数据结构
来源:https://www.cnblogs.com/chengeputongren/p/12283654.html