- 模板參數能夠是數值型參數(非類型參數)
template < typename T, int N > void func() { T a[N]; // 使用模板參數定義局部數組 }
func<double, 10>();
數值型模板參數的限制ios
- 變量不能做爲模板參數
- 浮點數不能做爲模板參數
- 類對象不能做爲模板參數
- ......
本質:
模板參數是在編譯階段被處理的單元,所以,在編譯階段必須準確無誤的惟一肯定。面試
有趣的面試題:
用你以爲最高效的方法求 1 + 2 + 3 + ... + N 的值!編程
#include <iostream> using namespace std; template < typename T, int N > void func() { T a[N] = {0}; for(int i=0; i<N; i++) { a[i] = i; } for(int i=0; i<N; i++) { cout << a[i] << endl; } } 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 + ... + 10 = " << Sum<10>::VALUE << endl; cout << "1 + 2 + 3 + ... + 100 = " << Sum<100>::VALUE << endl; return 0; }
輸出: 1 + 2 + 3 + ... + 10 = 55 1 + 2 + 3 + ... + 100 = 5050
Array.h數組
#ifndef _ARRAY_H_ #define _ARRAY_H_ template < typename T, int N > class Array { private: 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(); // 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 = (index >=0) && (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 = (index >=0) && (index < N); if( ret ) { value = m_array[index]; } return ret; } template < typename T, int N > T& Array<T, N>::operator[] (int index) { return m_array[index]; } template < typename T, int N > T Array<T, N>::operator[] (int index) const { return m_array[index]; } template < typename T, int N > Array<T, N>::~Array() { } #endif
main.cpp數據結構
#include <iostream> #include "Array.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; }
輸出: 0 1 4 9 16
HeapArray.h函數
#ifndef _HEAPRRAY_H_ #define _HEAPARRAY_H_ template < typename T > class HeapArray { private: int m_length; T* m_pointer; HeapArray(int len); HeapArray(const HeapArray& obj); bool construct(); public: static HeapArray* NewInstance(int length); int length(); bool get(int index, T& value); bool set(int index, T value); T& operator [] (int index); T operator [] (int index) const; HeapArray& operator = (const HeapArray& obj); HeapArray& self(); ~HeapArray(); }; template < typename T > HeapArray<T>::HeapArray(int len) { m_length = len; } template < typename T > bool HeapArray<T>::construct() { m_pointer = new T[m_length]; return m_pointer != NULL; } template < typename T > HeapArray<T>* HeapArray<T>::NewInstance(int length) { HeapArray<T>* ret = new HeapArray(length); if( !(ret && (ret->construct())) ) { delete ret; ret = 0; } return ret; } template < typename T > int HeapArray<T>::length() { return m_length; } template < typename T > bool HeapArray<T>::get(int index, T& value) { bool ret = (index >= 0) && (index < length()); if( ret ) { value = m_pointer[index]; } return ret; } template < typename T > bool HeapArray<T>::set(int index, T value) { bool ret = (index >= 0) && (index < length()); if( ret ) { m_pointer[index] = value; } return ret; } template < typename T > T& HeapArray<T>:: operator [] (int index) { return m_pointer[index]; } template < typename T > T HeapArray<T>:: operator [] (int index) const { return m_pointer[index]; } template < typename T > HeapArray<T>& HeapArray<T>:: operator = (const HeapArray<T>& obj) { if( this != &obj ) { T* pointer = new T[obj.m_length]; if( pointer ) { for(int i=0; i<obj.m_length; i++) { pointer[i] = obj.m_pointer[i]; } m_length = obj.m_length; delete m_pointer; m_pointer = pointer; } } return *this; } template < typename T > HeapArray<T>& HeapArray<T>::self() { return *this; } template < typename T > HeapArray<T>::~HeapArray() { delete[] m_pointer; } #endif
main.cppthis
#include <iostream> #include "HeapArray.h" using namespace std; int main() { HeapArray<char>* pai = HeapArray<char>::NewInstance(10); if( pai != NULL ) { HeapArray<char>& ai = pai->self(); for(int i=0; i<ai.length(); i++) { ai[i] = i + 'a'; } for(int i=0; i<ai.length(); i++) { cout << ai[i] << endl; } } delete pai; return 0; }
輸出: a b c d e f g h i j
- 模板參數能夠是數值類型
- 數值型模板參數必須在編譯期間惟一肯定
- 數組類模板是基於數值型模板參數實現的
- 數組類模板是簡易的線性表數據結構
以上內容參考狄泰軟件學院系列課程,請你們保護原創!spa