您好,登錄后才能下訂單哦!
如何進行C++模板顯式具體化的分析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
模板函數雖然非常好用,但是也存在一些問題。比如有的操作并不是對所有類型都適用的,針對這種情況C++提供了一個解決方案,就是針對特定類型提供具體化的模板定義。這里的具體可以理解成類型的具體。
我們來看一個C++ Primer當中的例子,假設現在我們有一個結構體叫做job:
struct job { string name; double salary; int floor; }
對于結構體是可以整體賦值的,所以之前的Swap
函數對它一樣適用。
template <typename T> void Swap(T &a, T &b) { T temp = a; a = b; b = temp; }
但我們現在希望在交換結構體的時候,只是交換salary
和floor
這兩個字段,把name
保持不變。由于我們希望引入邏輯變化,所以直接調用Swap函數就不可行了。
當然我們可以不用函數模板,直接重載函數:
void Swap(job &a, job &b) { // swap為std自帶的交換函數,在algorithm頭文件中 swap(a.salary, b.salary); swap(a.floor, b.floor); }
由于C++當中規定,非函數模板的優先級大于函數模板,所以我們在對job結構體調用Swap函數的時候,會優先使用這個。
除此之外,我們還可以提供一個具體化的模板函數:
template <> void Swap<job> (job &a, job &b) { swap(a.salary, b.salary); swap(a.floor, b.floor); }
這個函數的寫法看起來有些特殊,我們在函數類型之前加上了template <>,在函數名后面又跟上了<job>。它表示的是這是一個函數模板的顯式具體化,也可以理解成為之前的函數模板提供一個job類型的版本。C++當中規定顯式模板函數的優先級高于普通模板函數。
看完上述內容,你們掌握如何進行C++模板顯式具體化的分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。