成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++類模板特化基本概念概述

開發 后端
C++類模板特化的一些相關操作基本上都是在類名后進行的。我們將特化的步驟分為全局特化與局部特化這兩種。下面將對其進行詳細介紹。

我們在上一篇文章中為大家詳細介紹了C++類模板的具體應用方式,相比朋友們應該可以從中對類模板有一個充份的認識。那么C++類模板特化又是如何進行的呢?其實,C++類模板特化被描述為一個和重載類似的概念。

我的理解是,特化允許我們對某些特殊的參數(這里就是類型)進行特殊的處理。C++類模板特化的處理都是在類名后面做文章的。特化分為全局特化和局部特化。對于全局特化,書中的例子是希望對于Stack< T>模板,如果參數為std::string的類型,就用deque作為容器來處理,而其他的保持不變。因此,我們需要對Stack< T>模板作std::string的特化處理。代碼如下:

 

  1. #include < deque> 
  2. #include < string> 
  3. #include < stdexcept> 
  4. #include "Stack.h"  
  5. template< > 
  6. class Stack< std::string>{  
  7. private:  
  8. std::deque< std::string> elems;  
  9. public:  
  10. void push(std::string const&);  
  11. void pop();  
  12. std::string top() const;  
  13. bool empty() const{  
  14. return elems.empty();  
  15. }  
  16. };  
  17. void Stack< std::string>::push(std::string const& elem)  
  18. {  
  19. elems.push_back(elem);  
  20. }  
  21. void Stack< std::string>::pop()  
  22. {  
  23. if(elems.empty())  
  24. {  
  25. throw std::out_of_range("Stack< std::string>::pop()==> empty stack.");  
  26. }  
  27. elems.pop_back();  
  28. }  
  29. std::string Stack< std::string>::top() const  
  30. {  
  31. if(elems.empty())  
  32. {  
  33. throw std::out_of_range("Stack< std::string>::pop()==> empty stack.");  
  34. }  
  35. return elems.back();  

注意到C++類模板特化的定義和普通的類模板完全不一樣了。主要區別有:#t#

特化類模板的前面加上了template< >,沒有指定參數。而是在類名后面指定了類型參數。

在函數的定義里面,原來的類型T全部換成了特化的類型std::string。實際上,完全可以根據特殊需要重寫成員函數。甚至可以定義另外的函數。

將上面的源代碼加入到工程中,編譯運行。就會發現當使用std::string去實例化stack的時候實際上調用的是StringStack文件中的"重載"版本。各個方法的調用也一樣。也就是說,特化實際上是要求對特定的參數施行特殊的處理。從這個方面來說和重載確實很類似。

但是,我認為特征化和重載還是有區別的。試想有一個函數Func(int, int),另外一個函數對它進行重載為Func(string, string)。在實際上我們也可以說int的Func重載了string的Func,這是相互的。但是特化卻不能這么說。因為特化是對某種類型的特殊處理,我們可以說特化模板重載了某個模板,但是不能說某個模板重載了特化的模板。這是單方向的。另外,如果,我們不需要Func(int, int)函數,我們完全可以把它刪去。但是C++類模板特化不能離開它依賴的類模板單獨存在。在上面的例子中,如果刪除Stack.h文件,StringStack.h文件的定義就會出錯。

StringStack是Stack模板的特化。但是他們之間的聯系其實不是那么緊密,除了名字上以外。例如,Stack模板中的成員函數不必非得在StringStack中出現;同理,StringStack中的函數也不必是Stack中的函數。也就是說,特化的模板類可以根據自己的需要完全重寫指定的模板函數,也可以棄原來模板函數中的成員不用,另外定義成員函數。這方面沒有限制。

在理解了全局的特化以后,在來看局部的特化就很容易明白了。局部特化是要求在指定的條件下使用指定的類模板的重載版本。

責任編輯:曹凱 來源: 博客園
相關推薦

2010-02-02 13:41:01

C++類繼承

2010-02-05 17:34:37

C++函數模板

2010-02-04 17:39:48

C++字符串類型

2010-02-06 15:58:10

C++集合初始化

2010-02-04 14:01:43

C++非類型類模板參數

2010-02-03 13:22:07

C++時間

2010-02-05 12:57:20

C++ kdevelo

2010-02-02 10:33:22

C++引用

2010-02-03 11:11:18

C++類型轉換

2010-02-02 15:30:05

C++ include

2010-02-01 17:24:41

C++循環語句

2010-02-03 14:36:47

C++仿函數

2022-01-17 10:12:47

C++‘模板元編程

2010-02-06 14:04:58

C++內存使用機制

2010-02-04 10:08:00

C++靜態成員函數

2010-02-01 14:07:12

C++多態性

2010-02-04 17:32:43

C++中C風格字符串

2010-02-02 10:07:59

C++全局函數

2011-03-28 11:05:17

ODBC

2017-03-27 20:42:17

遷移學習人工智能機器學習
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久久久冷 | 成人在线视频免费看 | 国产精品免费一区二区三区 | 少妇诱惑av| 国产精品美女久久久久aⅴ国产馆 | 国产综合久久 | 精品久久久久久亚洲综合网 | 男女网站免费 | 日韩午夜 | 国产中文 | 午夜爱爱毛片xxxx视频免费看 | 伊人久久免费 | 国产区视频在线观看 | 日韩一区二区三区精品 | 色888www视频在线观看 | 欧美成人精品激情在线观看 | 亚洲激情一区二区 | 欧美日韩国产一区 | 99riav3国产精品视频 | 日韩精品中文字幕一区二区三区 | 99re视频 | 国产精品一二三区 | 日韩在线日韩 | 偷拍亚洲色图 | 视频一区二区三区中文字幕 | 色综合一区二区三区 | 一区二区三区国产视频 | 久久久蜜桃 | 国产精品天堂 | 久久精品国产v日韩v亚洲 | 欧美亚洲国产一区二区三区 | 精品亚洲一区二区三区四区五区 | 成人小视频在线观看 | 日本欧美国产在线观看 | 国产亚洲一区二区三区 | 精品国产99 | 999久久久久久久久6666 | 亚洲欧美日韩精品久久亚洲区 | 婷婷在线网站 | 久久国产精品一区二区三区 | 国产精品日日摸夜夜添夜夜av |