這是一篇譯文原文地址
模板我將從兩個(gè)方面來為大家介紹
模板類
模板函數(shù)
如果即使數(shù)據(jù)類型不一樣阵幸,有一些類卻可以做同樣的事,這樣該多好芽世?一個(gè)類來讓你選擇它是作用于什么數(shù)據(jù)類型的挚赊。
模板是一種讓你的類更加抽象的方法,它可以讓你在不知道將要處理什么樣的數(shù)據(jù)類型的時(shí)候定義類的行為济瓢。本質(zhì)上這被稱為泛型編程荠割。這是一個(gè)對(duì)于理解模板來說一個(gè)重要的概念因?yàn)樗嵝殉绦騿T:一個(gè)模板類是不依賴于它將要處理的數(shù)據(jù)的類型的。進(jìn)一層說旺矾,一個(gè)模板類更關(guān)心的是算法而不是一個(gè)數(shù)據(jù)類型的特殊差別蔑鹦。模板類可以和抽象數(shù)據(jù)類型一起使用來使其可以處理任何數(shù)據(jù)類型的數(shù)據(jù)。例如箕宙,你可能會(huì)定義一個(gè)模板棧類來處理一個(gè)任何數(shù)據(jù)類型的棧嚎朽,而不是為每一個(gè)數(shù)據(jù)類型都創(chuàng)建一個(gè)棧類。這種使一個(gè)類可以處理不同類型的數(shù)據(jù)意味著代碼更容易維護(hù)扒吁,類更加可復(fù)用火鼻。
模板類
- 聲明模板類
template <class a_type> class a_class {...};
上面的class表示a_type代表一種數(shù)據(jù)類型,注意a_type不是一個(gè)關(guān)鍵字雕崩,是在程序執(zhí)行時(shí)代表一個(gè)數(shù)據(jù)類型的標(biāo)識(shí)符魁索。例如當(dāng)在類中定義變量時(shí)你可以這樣
a_type a_var
當(dāng)開發(fā)者定義了當(dāng)程序初始化一個(gè)a_class的特殊實(shí)例時(shí)a_type的數(shù)據(jù)類型是什么,a_var的類型就會(huì)和其一樣盼铁,當(dāng)在模板類中定義成員函數(shù)時(shí)粗蔚,有必要把它定義為一個(gè)模板函數(shù)。
template<class a_type> void a_class<a_type>::a_function(){...}
- 定義一個(gè)模板類的實(shí)例
a_class<int> an_example_class;
模板類的一個(gè)實(shí)例對(duì)象成為特殊化饶火,特殊化提醒我們?cè)瓉淼念愂且粋€(gè)泛型類鹏控,鑒于一個(gè)類的特定實(shí)例被指定為單一的數(shù)據(jù)類型(可以是很多類型)
通常從具體到抽象比較容易,因此寫一個(gè)指定數(shù)據(jù)類型的的類然后變?yōu)槟0宓姆羟蓿盒偷念愂呛苋菀椎摹?/li> - 我們先定義一個(gè)作用于整型的類
class calc
{
public:
int multiply(int x, int y);
int add(int x, int y);
};
int calc::multiply(int x, int y)
{
return x*y;
}
int calc::add(int x, int y)
{
return x+y;
}
如果我們希望浮點(diǎn)型數(shù)據(jù)也可以怎么辦呢当辐?我們將會(huì)使用一個(gè)模板
template <class A_Type> class calc
{
public:
A_Type multiply(A_Type x, A_Type y);
A_Type add(A_Type x, A_Type y);
};
template <class A_Type> A_Type calc<A_Type>::multiply(A_Type x,A_Type y)
{
return x*y;
}
template <class A_Type> A_Type calc<A_Type>::add(A_Type x, A_Type y)
{
return x+y;
}
模板函數(shù)
模板函數(shù)比模板類要簡(jiǎn)單點(diǎn),因?yàn)榫幾g器可以從函數(shù)的參數(shù)列表中推斷想要的類型
- 聲明一個(gè)可以把兩數(shù)相加的模板函數(shù)
template <class type> type add(type a, type b)
{
return a + b;
}
add<int>( 1, 2);//結(jié)果是 3
add<int>(5.6, 8.0);//結(jié)果是鲤看?