C 模板實參中的引數可以省略的情況分析

2021-09-14 01:55:33 字數 924 閱讀 8077

先來看一道c++二級真題+未來教育解析:

關於在呼叫模板函式時模板實參的使用,下列表述中正確的是()。

a)對於虛擬型別引數所對應的模板實參,如果能從模板函式的實參中獲得相同的資訊,則都可以省略

b)對於虛擬型別引數所對應的模板實參,如果它們是參數列中的最後的若干個引數,則都可以省略

c)對於虛擬型別引數所對應的模板實參,若能夠省略則必須省略

d)對於常規引數所對應的模板實參,任何情況下都不能省略

【未來教育解析】

在呼叫乙個模板函式時,編譯系統需要足夠的資訊來判別每個虛擬型別引數所對應的實際型別,可以從兩個不同的渠道獲得這樣的資訊:從模板實參表(用「<>」括起來的參數列)或從模板函式實參表(用「()」括起來的參數列)(這句話表述不準確,應該表述為:從模板函式的形參表(用「()」括起來的參數列)中的形參所對應的實參) 。如果從後者獲得的資訊已經能夠判定其中部分或全部虛擬型別參教所對應的實際引數,而且它們又正好是參數列中最後的若干引數,則模板實參表中的那幾個引數可以省略。如果模板實參表中的實參都被省略了,則空表「<>」也可以不要,因此選項d錯誤。反之,對於某個模板實參,如果從模板函式的實參表中無法獲得同樣的資訊,就不能省略;或者雖然能夠獲得同樣的資訊,但在它後面還有其他不能省略的實參,則其自身還是不能省略。本題答案為a選項。

【個人解析】

**舉例:

#include 

using namespace std;

template, typename t2

>

//<>裡的是虛擬型別引數t1f

(t2 n)

int main()

a、b分別是模板函式的實參,從實參中獲得的資訊已經能夠判定模板函式的模板實參表中部分或全部虛擬型別參教所對應的實際引數,而且它們又正好是模板實參表中最後的若干引數,則模板實參表中的那幾個引數可以省略。

非型別引數的模板實參

類模板引數也可以是乙個非型別模板引數。例如 templateclass screen private string screen string size type cursor short height short width typedef screen 24,80 termscreen term...

模板實參推導 xx cast的實現

首先,類模板必須被顯式特化。當然了,可以通過乙個輔助函式,通過引數型別,返回特化的類模板,來間接處理。這個技術被廣泛應用在ptr fun,make pair,mem fun,back inserter等輔助函式裡面,來完成那些易於出錯的類模板特化任務。跟函式實參推導 根據實參所在的名字空間,推導出用...

STL運用的C 技術(3) 模板實參推斷

stl是c 標準庫的重要組成部分之一,它不僅是乙個可復用的元件庫,更是乙個包含演算法與資料結構的軟體框架,同時也是c 泛型程式設計的很好例子。stl中運用了許多c 的高階技術。本文介紹模板實參推斷的運用。主要參考了 c primer 和 stl原始碼剖析 stl利用模板模板實現的,比如它的演算法都是...