新聞中心
我們?cè)谏弦黄恼轮袨榇蠹以敿?xì)介紹了C++類(lèi)模板的具體應(yīng)用方式,相比朋友們應(yīng)該可以從中對(duì)類(lèi)模板有一個(gè)充份的認(rèn)識(shí)。那么C++類(lèi)模板特化又是如何進(jìn)行的呢?其實(shí),C++類(lèi)模板特化被描述為一個(gè)和重載類(lèi)似的概念。

創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比桑珠孜網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式桑珠孜網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋桑珠孜地區(qū)。費(fèi)用合理售后完善,10余年實(shí)體公司更值得信賴(lài)。
我的理解是,特化允許我們對(duì)某些特殊的參數(shù)(這里就是類(lèi)型)進(jìn)行特殊的處理。C++類(lèi)模板特化的處理都是在類(lèi)名后面做文章的。特化分為全局特化和局部特化。對(duì)于全局特化,書(shū)中的例子是希望對(duì)于Stack< T>模板,如果參數(shù)為std::string的類(lèi)型,就用deque作為容器來(lái)處理,而其他的保持不變。因此,我們需要對(duì)Stack< T>模板作std::string的特化處理。代碼如下:
- #include < deque>
- #include < string>
- #include < stdexcept>
- #include "Stack.h"
- template< >
- class Stack< std::string>{
- private:
- std::deque< std::string> elems;
- public:
- void push(std::string const&);
- void pop();
- std::string top() const;
- bool empty() const{
- return elems.empty();
- }
- };
- void Stack< std::string>::push(std::string const& elem)
- {
- elems.push_back(elem);
- }
- void Stack< std::string>::pop()
- {
- if(elems.empty())
- {
- throw std::out_of_range("Stack< std::string>::pop()==> empty stack.");
- }
- elems.pop_back();
- }
- std::string Stack< std::string>::top() const
- {
- if(elems.empty())
- {
- throw std::out_of_range("Stack< std::string>::pop()==> empty stack.");
- }
- return elems.back();
- }
注意到C++類(lèi)模板特化的定義和普通的類(lèi)模板完全不一樣了。主要區(qū)別有:#t#
特化類(lèi)模板的前面加上了template< >,沒(méi)有指定參數(shù)。而是在類(lèi)名后面指定了類(lèi)型參數(shù)。
在函數(shù)的定義里面,原來(lái)的類(lèi)型T全部換成了特化的類(lèi)型std::string。實(shí)際上,完全可以根據(jù)特殊需要重寫(xiě)成員函數(shù)。甚至可以定義另外的函數(shù)。
將上面的源代碼加入到工程中,編譯運(yùn)行。就會(huì)發(fā)現(xiàn)當(dāng)使用std::string去實(shí)例化stack的時(shí)候?qū)嶋H上調(diào)用的是StringStack文件中的"重載"版本。各個(gè)方法的調(diào)用也一樣。也就是說(shuō),特化實(shí)際上是要求對(duì)特定的參數(shù)施行特殊的處理。從這個(gè)方面來(lái)說(shuō)和重載確實(shí)很類(lèi)似。
但是,我認(rèn)為特征化和重載還是有區(qū)別的。試想有一個(gè)函數(shù)Func(int, int),另外一個(gè)函數(shù)對(duì)它進(jìn)行重載為Func(string, string)。在實(shí)際上我們也可以說(shuō)int的Func重載了string的Func,這是相互的。但是特化卻不能這么說(shuō)。因?yàn)樘鼗菍?duì)某種類(lèi)型的特殊處理,我們可以說(shuō)特化模板重載了某個(gè)模板,但是不能說(shuō)某個(gè)模板重載了特化的模板。這是單方向的。另外,如果,我們不需要Func(int, int)函數(shù),我們完全可以把它刪去。但是C++類(lèi)模板特化不能離開(kāi)它依賴(lài)的類(lèi)模板單獨(dú)存在。在上面的例子中,如果刪除Stack.h文件,StringStack.h文件的定義就會(huì)出錯(cuò)。
StringStack是Stack模板的特化。但是他們之間的聯(lián)系其實(shí)不是那么緊密,除了名字上以外。例如,Stack模板中的成員函數(shù)不必非得在StringStack中出現(xiàn);同理,StringStack中的函數(shù)也不必是Stack中的函數(shù)。也就是說(shuō),特化的模板類(lèi)可以根據(jù)自己的需要完全重寫(xiě)指定的模板函數(shù),也可以棄原來(lái)模板函數(shù)中的成員不用,另外定義成員函數(shù)。這方面沒(méi)有限制。
在理解了全局的特化以后,在來(lái)看局部的特化就很容易明白了。局部特化是要求在指定的條件下使用指定的類(lèi)模板的重載版本。
標(biāo)題名稱(chēng):C++類(lèi)模板特化基本概念概述
URL地址:http://fisionsoft.com.cn/article/ccepddo.html


咨詢(xún)
建站咨詢(xún)
