欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C++ 模板基礎談 - C/C++ / C++ 語(yǔ)言
打算給公司的同事上課,以便推廣 C++ 模板,寫(xiě)了以下教程。希望能看到各種意見(jiàn),以便完善它。

C++ 模板基礎談

1. 什么是模板
模板定義:模板就是實(shí)現代碼重用機制的一種工具,它可以實(shí)現類(lèi)型參數化,即把類(lèi)型定義為參數,從而實(shí)現了真正的代碼可重用性。
我們知道,C++ 是一種“強類(lèi)型”的語(yǔ)言,也就是說(shuō)一個(gè)變量,編譯器必須確切的知道它的類(lèi)型,而模板就是構建在這個(gè)強類(lèi)型語(yǔ)言基礎上的泛型系統。

2. 模板的語(yǔ)法
模板函數
template< typename {類(lèi)型參數名稱(chēng)}, [ int {Name}=...][, ...] >
{函數定義}

模板類(lèi)
template< typename ... , [ int {Name}=...] >
class ...

模板的參數可以是類(lèi)型,或者是一個(gè) int 型的值(或者可以轉換為int 型的,比如 bool)。

3. 模板的使用
顯式類(lèi)型參數:對于模板函數,在函數名后添加 < {類(lèi)型參數表} >。對于模板類(lèi),在類(lèi)后添加 < {類(lèi)型參數表} >
隱式類(lèi)型參數:對于模板函數,如果類(lèi)型參數可以推導,那么可以省略類(lèi)型參數表
舉個(gè)例子:
template< typename T >
T max( T a, T b )
{
  return a < b ? b : a;
}

這個(gè) max 函數就是一個(gè)模板函數,它可以傳入一個(gè) “類(lèi)型”的參數,以便實(shí)現任意類(lèi)型求最大值的效果。假設我們這樣使用它:
int x=5, y=10;
int z=max<int>( x, y );
這時(shí)候發(fā)生了什么呢?我們傳入的“類(lèi)型參數”是int,因此編譯器在編譯這段代碼時(shí)會(huì )使用 int 來(lái)構造一個(gè)新函數:
int max( int a, int b )
{
  return a < b ? b : a;
}
后面的事就和編譯普通的函數一樣了,C++編譯器繼續使用強類(lèi)型系統編譯這個(gè)函數,由強類(lèi)型系統來(lái)檢查這個(gè)函數是否正確。
這個(gè)過(guò)程叫做模板的“特化”,它發(fā)生在編譯期,當編譯器發(fā)現模板函數、模板類(lèi)被使用(注意,不是定義)的時(shí)候進(jìn)行的。這個(gè)系統實(shí)際上比較像宏,但是比宏更為智能。
很明顯,編譯器必須知道模板如何特化這個(gè)函數,因此模板函數的實(shí)現,必須在“使用點(diǎn)”之前,因此模板庫只能通過(guò)頭文件庫的形式來(lái)提供。

4. 模板的類(lèi)型推導
對于函數,編譯器是知道傳入參數的類(lèi)型的,比如上面的max,max< ? >( x, y ),由于第一個(gè)參數 x 是 int 類(lèi)型的,那么 ? 這里需要填寫(xiě)什么呢?
我們可以很明顯的推斷出應該是 "int",否則,后面的強類(lèi)型系統將無(wú)法編譯這個(gè)函數。編譯器同樣知道 x 的類(lèi)型,因此它也能推導出“類(lèi)型參數”,這時(shí)候我們調用時(shí)就可省略模板參數了。
這個(gè)推導是按順序來(lái)的,因此如果上面的 y 是其他類(lèi)型,? 仍然會(huì )被推導為 int,如果y無(wú)法隱性轉換為int,強類(lèi)型編譯時(shí)就會(huì )報錯。

5. 類(lèi)型推導的隱式類(lèi)型轉換
在決定模板參數類(lèi)型前,編譯器執行下列隱式類(lèi)型轉換:

  左值變換
  修飾字轉換
  派生類(lèi)到基類(lèi)的轉換

  見(jiàn)《C++ Primer》([注2],P500)對此主題的完備討論。

簡(jiǎn)而言之,編譯器削弱了某些類(lèi)型屬性,例如我們例子中的引用類(lèi)型的左值屬性。舉例來(lái)說(shuō),編譯器用值類(lèi)型實(shí)例化函數模板,而不是用相應的引用類(lèi)型。

同樣地,它用指針類(lèi)型實(shí)例化函數模板,而不是相應的數組類(lèi)型。

它去除const修飾,絕不會(huì )用const類(lèi)型實(shí)例化函數模板,總是用相應的非 const類(lèi)型,不過(guò)對于指針來(lái)說(shuō),指針和 const 指針是不同的類(lèi)型。

底線(xiàn)是:自動(dòng)模板參數推導包含類(lèi)型轉換,并且在編譯器自動(dòng)決定模板參數時(shí)某些類(lèi)型屬性將丟失。這些類(lèi)型屬性可以在使用顯式函數模板參數申明時(shí)得以保留。

6. 模板的偏特化
如果我們打算給模板函數(類(lèi))的某個(gè)特定類(lèi)型寫(xiě)一個(gè)函數,就需要用到模板的偏特化,比如我們打算用 long 類(lèi)型調用 max 的時(shí)候,返回小的值(原諒我舉了不恰當的例子):
template<> // 這代表了下面是一個(gè)模板函數
long max<long>( long a, long b ) // 對于 vc 來(lái)說(shuō),這里的 <long> 是可以省略的
{
  return a > b ? b : a;
}
實(shí)際上,所謂偏特化,就是代替編譯器完成了對指定類(lèi)型的特化工作,現代的模板庫中,大量的使用了這個(gè)技巧。

7. 仿函數
仿函數這個(gè)詞經(jīng)常會(huì )出現在模板庫里(比如 STL),那么什么是仿函數呢?
顧名思義:仿函數就是能像函數一樣工作的東西,請原諒我用東西這樣一個(gè)代詞,下面我會(huì )慢慢解釋。
void dosome( int i )
這個(gè) dosome 是一個(gè)函數,我們可以這樣來(lái)使用它: dosome(5);
那么,有什么東西可以像這樣工作么?
答案1:重載了 () 操作符的對象,比如:
  struct DoSome
  {
  void operator()( int i );
  }
  DoSome dosome;
這里類(lèi)(對 C++ 來(lái)說(shuō),struct 和類(lèi)是相同的) 重載了 () 操作符,因此它的實(shí)例 dosome 可以這樣用 dosome(5); 和上面的函數調用一模一樣,不是么?所以 dosome 就是一個(gè)仿函數了。

實(shí)際上還有答案2:
  函數指針指向的對象。
  typedef void( *DoSomePtr )( int );
  typedef void( DoSome )( int );
  DoSomePtr *ptr=&func;
  DoSome& dosome=*ptr;
   
  dosome(5); // 這里又和函數調用一模一樣了。
當然,答案3 成員函數指針指向的成員函數就是意料之中的答案了。

8. 仿函數的用處
不管是對象還是函數指針等等,它們都是可以被作為參數傳遞,或者被作為變量保存的。因此我們就可以把一個(gè)仿函數傳遞給一個(gè)函數,由這個(gè)函數根據需要來(lái)調用這個(gè)仿函數(有點(diǎn)類(lèi)似回調)。

STL 模板庫中,大量使用了這種技巧,來(lái)實(shí)現庫的“靈活”。
比如:
for_each, 它的源代碼大致如下:
template< typename Iterator, typename Functor >
void for_each( Iterator begin, Iterator end, Fucntor func )
{
  for( ; begin!=end; begin++ )
  func( *begin );
}

這個(gè) for 循環(huán)遍歷了容器中的每一個(gè)元素,對每個(gè)元素調用了仿函數 func,這樣就實(shí)現了 對“每個(gè)元素做同樣的事”這樣一種編程的思想。

特別的,如果仿函數是一個(gè)對象,這個(gè)對象是可以有成員變量的,這就讓 仿函數有了“狀態(tài)”,從而實(shí)現了更高的靈活性。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C 模板
<轉載>獨一無(wú)二的C++模板
C加加模板之類(lèi)模板的特化
《Effective C 》讀書(shū)摘要
C ++template模板 學(xué)習筆記
構建吞吐量系列之模板元編程基礎
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久