概述
與函數(shù)模板相同突诬,類模板也已關鍵字template
開頭唯鸭,后接模板參數(shù)以及類模板的聲明或?qū)崿F(xiàn).模板參數(shù)在整個類實現(xiàn)中都可見定枷,也就是可以在類實現(xiàn)中利用模板參數(shù)定義成員變量類型条摸,成員函數(shù)參數(shù)類型及返回值類型等.
template<typename T>
struct ListNode
{
T value;
ListNode* next;//等價于ListNode<T>* next;
}
在上例中,模板參數(shù) T 被用于定義成員變量 value 的類型铸屉,另一個成員變量 next 指向一個ListNode的指針,但ListNode只是一個模板名彻坛,并不代表實際的類.在此顷啼,c++有一個特別的規(guī)定:在一個類模板內(nèi)出現(xiàn)的自身模板名,等價于該模板被調(diào)用時所生成的實例.
類模板參數(shù)也支持默認值线梗,如果類模板參數(shù)有默認值,則在實參列表可中將其省略煮嫌,如果所有參數(shù)都有默認值懦冰,則模板實參列表可以省略,但尖括號不可省略.
ListNode<> inode;
另外乳附,與函數(shù)模板不同非凌,類模板沒有模板參數(shù)實參推導機制秸妥,所以,對于沒有默認值的模板參數(shù)只能一一為其賦值涡贱,而可以省略的列表只限于列表最后有默認值的若干參數(shù).
類模板不僅可以用來生成類的實例,還可作為其他類或模板類的基類.類模板的基類必須是某個類型,如下:
template<typename T>
class CountStack : public MyStack<T>
{};
如果是普通類以類模板實例為基類吆倦,需要為基類模板給定明確的模板參數(shù)值.
class CharStack : public MyStack<char>
{};
異質(zhì)鏈表
上例的類模板ListNode中只有一個模板參數(shù)逼庞,即節(jié)點所保存的數(shù)據(jù)類型T,而節(jié)點的另一個成員變量next指針篓像,其類型固定為指向另一同類型節(jié)點類,這就使得整個鏈表只能保存同一類型的數(shù)據(jù).
若是next指針所指類型也由一個新的模板參數(shù)定義奠滑,則next可指向任何一種類型丹皱,那么由此節(jié)點類模板的一系列實例構(gòu)成的鏈表就可用于保存不同類型的值,從而構(gòu)成異質(zhì)鏈表.
template<typename T, typename N>
struct HeteroNode
{
T value;
N* next;
HeteroNode(T const& v, N* n):value(v), next(n){};
};
int main(int argc, char* argv[])
{
typedef HeteroNode<int,void> node_0;
typedef HeteroNode<char,node_0> node_1;
typedef HeteroNode<std::string,node_1> node_2;
node_0* p0 = new HeteroNode<int,void>(12,nullptr);
node_1* p1 = new HeteroNode<char,node_0>('t',p0);
node_2* p2 = new HeteroNode<std::string,node_1>("lumin", p1);
std::cout << p2->value << " " << p2->next->value << " " << p2->next->next->value << " \n";
return 0;
}
原文首發(fā)于本人獨立博客宋税;轉(zhuǎn)載注明出處