模板参数可以是字面量型参数(非类型参数),
template <typename T,int N> // N是字面量型参数 void function() { } function<double,10>(); // 调用时
字面量型参数限制:变量,浮点数(无法精确表示),类对象不能作为模板参数。(模板参数是在编译阶段是要被确定的)
// 类模板实现递归 template < int N > // 字面量参数模板 class Sum { public: static const int VALUE = Sum<N-1>::VALUE + N; // 递归过程是由编译器完成的 }; template < > // 参数为字面量的完全特化模板 class Sum < 1 > // 当N为1时调用这里的模板,递归的截至条件 { public: static const int VALUE = 1; // VALUE 可能存入静态存储区,可能存入常量表。由于定义了值,所以进入常量表。由于被static声明,所以进入静态存储区。 }; int main() { cout << Sum<10>::VALUE << endl; // 编译时就做了递归操作,所以VALUE值是一个常量值,这里只是访问 return 0; }
数组模板类:
1 #ifndef _ARRAY_H_ 2 #define _ARRAY_H_ 3 4 template 5 < typename T, int N > 6 class Array 7 { 8 T m_array[N]; 9 public: 10 int length(); 11 bool set(int index, T value); 12 bool get(int index, T& value); 13 T& operator[] (int index); 14 T operator[] (int index) const; 15 virtual ~Array(); 16 }; 17 18 template 19 < typename T, int N > 20 int Array<T, N>::length() 21 { 22 return N; 23 } 24 25 template 26 < typename T, int N > 27 bool Array<T, N>::set(int index, T value) 28 { 29 bool ret = (0 <= index) && (index < N); 30 31 if( ret ) 32 { 33 m_array[index] = value; 34 } 35 36 return ret; 37 } 38 39 template 40 < typename T, int N > 41 bool Array<T, N>::get(int index, T& value) 42 { 43 bool ret = (0 <= index) && (index < N); 44 45 if( ret ) 46 { 47 value = m_array[index]; 48 } 49 50 return ret; 51 } 52 53 template 54 < typename T, int N > 55 T& Array<T, N>::operator[] (int index) 56 { 57 return m_array[index]; 58 } 59 60 template 61 < typename T, int N > 62 T Array<T, N>::operator[] (int index) const 63 { 64 return m_array[index]; 65 } 66 67 template 68 < typename T, int N > 69 Array<T, N>::~Array() 70 { 71 72 } 73 74 #endif
#include <iostream> #include <string> #include "Array.h" #include "HeapArray.h" using namespace std; int main() { Array<double, 5> ad; for(int i=0; i<ad.length(); i++) { ad[i] = i * i; } for(int i=0; i<ad.length(); i++) { cout << ad[i] << endl; } return 0; }