非型別函式模板引數

2021-07-25 19:23:40 字數 2394 閱讀 4501

一、引入

你也可以為  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 非型別模板引數

對於函式模板與類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體的細節來加以確定 直到 被呼叫時這些細節才被真正的確定。但是在這裡,我們面對的是這些細節是值,而不是型別,當要使用基於值的模板時,必須顯式地指定這些值,才能夠對模板進行例項化。在上篇文章 ...