模板除了定義類型參數之外,也可以在模板內定義非類型參數
非類型參數不是類型,而是值,比如:指針,整數,引用
非類型參數的用法:
1.整數常量:非類型參數最常見的形式是整數常量,可以用于定義數組大小,循環次數等
2.指針和引用:雖然不如整數常量長劍,但指針和引用也可以作為非類型參數
3.枚舉類型:C++11及更高版本允許使用枚舉類型作為非類型參數
函數模板中的非類型參數
#include <iostream>using namespace std;template <typename T,unsigned size>
void showArr(T (&arr)[size]){for(int i=0;i<size;i++){cout<<arr[i]<endl;}
}int main(){int a[5]={9,7,5,3,1};showArr<int,5>(a);return 0;
}
上面的例子,函數模板中接收一個非類型參數size,作為數組arr的大小
類模板的非類型參數
#include <iostream>using namespace std;template <int N> //定義一個類模板,使用非類型參數N
class Array{public:int data[N];void print(){for(int i=0;i<N;++i){cout << data[i] << "";}cout << endl;}
};int main(){Array<5> arr;for(int i=0;i<5;++i){arr.data[i] = i*2;}arr.print();//輸出:0,2,4,6,8return 0;
}
在這個例子中, Array 類模板接受一個非類型參數 N ,用于定義數組 data 的大小
非類型參數的要求
必須是編譯時的常量:非類型參數必須是編譯時的常量,例如常量表達式或constexpr變量
類型限制:非類型參數的類型通常是整形(如int char enum)或指向外部鏈接的指針,引用。從
模板實例化 :每個不同的非類型參數值都會生成不同的模板實例,這可能會導致代碼膨脹和編譯時間增加。
指針作為非類型參數
#include <iostream>
using namespace std;
// 定義一個函數模板,使用指針作為非類型參數
template <int* ptr>
void printValue() {cout << "The value is: " << *ptr << endl;
}
int main() {static int value = 42;printValue<&value>(); // 輸出:The value is: 42return 0;
}
在這個例子中, printValue 函數模板接受一個指向整數的指針作為非類型參數,并打印該指針指向的值