您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何在C++項(xiàng)目中實(shí)現(xiàn)模板中的非類型參數(shù),內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
非類型模板參看,顧名思義,模板參數(shù)不限定于類型,普通值也可作為模板參數(shù)。在基于類型的模板中,模板實(shí)例化時(shí)所依賴的是某一類型的模板參數(shù),你定義了一些模板參數(shù)(template<typename T>)未加確定的代碼,直到模板被實(shí)例化這些參數(shù)細(xì)節(jié)才真正被確定。而非類型模板參數(shù),面對(duì)的未加確定的參數(shù)細(xì)節(jié)是指(value),而非類型。當(dāng)要使用基于值的模板時(shí),你必須顯式地指定這些值,模板方可被實(shí)例化。
#include<iostream> using namespace std; //在函數(shù)模板中使用非類型參數(shù) template<class T>void Swap(T &a, T &b); template<typename T, unsigned N>void Swap(T (&a)[N],T (&b)[N]); template<typename T, unsigned N>void printArray(T (&arr)[N]); int main(){ int m = 10, n = 90; Swap(m,n); cout << "m = " << m << ", n = " << n << endl; int a[5] = { 1, 2, 3, 4, 5 }; int b[5] = { 10, 20, 30, 40, 50 }; Swap(a, b); printArray(a); printArray(b); return 0; } template<class T> void Swap(T &a,T &b){ T temp = a; a = b; b = temp; } template<class T, unsigned N> void Swap(T (&a)[N],T (&b)[N]){ T temp; for (int i = 0; i < N;i++){ temp = a[i]; a[i] = b[i]; b[i] = temp; } } template<typename T, unsigned N>void printArray(T (&arr)[N]){ for (int i = 0; i < N;i++){ if (i == N-1){ cout << arr[i] << endl; } else{ cout << arr[i] << ", "; } } }
#include<iostream> #include<cstring> #include<cstdlib> using namespace std; //動(dòng)態(tài)數(shù)組實(shí)現(xiàn),在類模板中使用非類型參數(shù) template<typename T,int N> class Array{ public: Array(); ~Array(); public: T & operator[](int i);//重載下標(biāo)運(yùn)算符 int length() const{ return m_length; }//獲取數(shù)組長度 bool capacity(int n);//是否可改變數(shù)組容量 private: int m_length;//數(shù)組當(dāng)前長度 int m_capacity;//當(dāng)前內(nèi)存容量 T *m_p;//指向數(shù)組內(nèi)存的指針 }; template<typename T,int N> Array<T, N>::Array(){ m_p = new T[N]; m_capacity = m_length = N; } template<typename T,int N> Array<T, N>::~Array(){ delete[] m_p; } template<typename T,int N> T & Array<T, N>::operator[](int i){ if (i<0||i>=m_length){ cout << "Exception:Array index out of bounds!" << endl; } return m_p[i]; } template<typename T,int N> bool Array<T, N>:: capacity(int n){ if (n>0){ int len = m_length + n; if (len<=m_capacity){ m_length = len; return true; } else{ T *pTemp = new T[m_length + 2 * n*sizeof(T)]; if (NULL==pTemp){ cout << "Exception: Failed to allocate memory!"; return false; } else{ memcpy(pTemp,m_p,m_length*sizeof(T)); delete[] m_p; m_p = pTemp; m_capacity = m_length = len; } } } else{ int len = m_length - abs(n); if (len<0){ cout << "Exception:Array length is too small!" << endl; return false; } else{ m_length = len; return true; } } } int main(){ Array<int, 5> arr; for (int i = 0, len = arr.length(); i < len;i++){ arr[i] = 2 * i; } cout << "first print:" << endl; for (int i = 0, len = arr.length(); i < len;i++){ cout << arr[i] << " "; } cout << endl; //擴(kuò)大容量為增加的元素賦值 arr.capacity(8); for (int i = 5, len = arr.length(); i < len;i++){ arr[i] = 2 * i; } cout << endl; cout << "second print:" << endl; for (int i = 0, len = arr.length(); i < len;i++){ cout << arr[i] << " "; } cout << endl; arr.capacity(-4); cout << "third print: " << endl; for (int i = 0, len = arr.length(); i < len; i++){ cout << arr[i] << " "; } cout << endl; return 0; }
非類型模板參數(shù)是有類型限制的。一般而言,它可以是常整數(shù)(包括enum枚舉類型)或者指向外部鏈接對(duì)象的指針。
浮點(diǎn)數(shù)和類對(duì)象(class-type)不允許作為非類型模板參數(shù):
template<double VAL> // ERROR: 浮點(diǎn)數(shù)不可作為非類型模板參數(shù) double process(double v) { return v * VAL; } template<std::string name> // ERROR:類對(duì)象不能作為非類型模板參數(shù) class MyClass {} 稍作變通,我們即可使編譯通過: template<double* PVAL> double process(const double& x) { return x * (*PVAL); } template<const char* name> class MyClass { ... }
這樣可順利通過編譯,但如果想在當(dāng)前文件中使用這兩個(gè)模板,還需要?jiǎng)右恍┦帜_:
double val = 10; double res = process<&val>(20); // ERROR: 表達(dá)式必須含有常量值 MyClass<"hello"> x; // ERROR: 模板參數(shù)不能引用非外部實(shí)體 const char* s = "hello"; MyClass<s> x; // ERROR: 表達(dá)式必須含有常量值
這里就點(diǎn)出另外一點(diǎn)注意事項(xiàng),也就是非類型模板參數(shù)的限制,非類型模板參數(shù)可以是指針,但該指針必須指向外部鏈接對(duì)象,還記得在A.cpp中如何引用B.cpp中的全局變量嗎,在A.hpp中使用extern關(guān)鍵字對(duì)外部變量加以引用。
// B.cpp double val = 3.14159265; char str[] = "hello";
// A.hpp extern double val; extern char str[];
// A.cpp #include "A.hpp" double res = process<&val>(10); MyClass<str> x;
關(guān)于如何在C++項(xiàng)目中實(shí)現(xiàn)模板中的非類型參數(shù)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。