一、引入
你也可以為 function template 定義 nontype parameters。例如下面的 function template 定義了一組 函式,可以將引數 x 累加乙個值(val)後傳回:
template
t addvalue(t const& x)
當我們需要把「函式」或「某種通用操作」作為引數傳遞時,這一類函式就很有用。例如使用stl(standard template library,標準模板庫)時,你可以運用上述 function template 的例項(instantiation),將某值加到元素集內的每乙個元素身上:
std::transform (source.begin(), source.end(), // **端起止位置
dest.begin(), // 目的端起始位置
addvalue); // 實際操作
最後乙個自變數將 function template addvalue()例項化了,使其操作成為「將5加進乙個int 數 值中」。演算法transform()會對source 中的所有元素呼叫這個具現體(函式),然後把結果傳入 dest 中。
注意上述例子帶來的乙個問題:addvalue是個 function template 實體(instance),而我們知道,所謂「function templates 實體」被認為是命名了一組過載函式集,即使該函式集內可能只有乙個函式。 根據目前標準, 編譯器無法借助 「過載函式集」 來進行 template parameter 的推導。因此你不得不把 function template argument 強制轉型為精確型別:
std::transform (source.begin(), source.end(), // **端起止位置
dest.begin(), // 目的端起始位置
(int(*)(int const*)) addvalue); // 操作
c++ standard 中 已 有一 個提案 要 求修正這種行為 ,使你不必 在這種場合強制 轉型。在尚未獲得修正之前,為保證程式的可移植性,你還是得像上面那麼做。
二、侷限性
注意,nontype template parameters 有某些侷限:通常來說它們只能是常數整數(constant integral values),包括 enum,或是「指向外部鏈結(external linkage)之物件」的指標。
以浮點數或 class-type objects 作為 nontype template parameters 是不可以的:
// 錯誤:浮點值不能作為 template parameters
template
double process (double v)
// 錯誤:class objects 不能作為 template parameters
template
class myclass ;
不允許浮點字面常數 (floating-point literals) 或簡單的常量浮點表示式 (constant floating-point expressions)作為 template arguments,其實只是歷史因素,並非技術原因。由於並沒有什麼實作上的困難,或許將來c++會支援它。
由於字串字面常數(string literal)是一種採用內部鏈結(internal linkage)的物件,也就是說不同模組(modules)內的兩個同值的字串字面常數,其實是不同的物件,因此它們也不能被拿來作為 template arguments:
template
class myclass ;
// 錯誤:不能使用字串常量"hello"
myclass<"hello"> x;
此外,全域性指標也不能被拿來作為 template arguments:
template
class myclass ;
char const* s = "hello";
// 錯誤:s 是「指向內部鏈結(internal linkage)物件」的指標
myclassx;
但是你可以這麼寫:
template
class myclass ;
extern char const s = "hello";
myclassx; // ok
全域性的 char array s 被初始化為 "hello",因此 s 是乙個外部鏈結(external linkage) 物件。
模板 一 模板與非型別模板引數 模板的模板引數
活著就意味必須要做點什麼,請好好努力。地下 模版是泛型程式設計的基礎,模版分為 函式模版 和 類模版 函式模板格式 template class 或typename 形參名1 class 形參名2 class 形參名n 返回型別 函式名 引數列表 模板形參的定義既可以使用class,也可以使用typ...
非型別模板引數
這是 c templates 第四章的學習筆記。這一章和下一章可以看作是對前面介紹的函式模板和類模板的補充。這章的主要內容包括 非型別的類模板引數。非型別的函式模板引數。非型別模板引數的限制。在具體介紹以前有比較說明一下什麼是非型別的模板引數。在前面簡單介紹函式模板和類模板的時候,我們都再三說明,模...
C 非型別模板引數
對於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被呼叫時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化。在上篇文章 ...