C++中突出的特性之一就是代碼重用蛇耀,而模板在其中發(fā)揮了重要的作用块茁,STL也是依托于C++模板而實(shí)現(xiàn)的最為廣泛和有用的工具庫(kù)癣蟋。模板所涉及到的知識(shí)比較雜剥险,簡(jiǎn)單總結(jié)如下聪蘸,以便日后溫習(xí)。
1.基本使用
模板使用關(guān)鍵字template定義表制,可以使用class或者typename來(lái)聲明模板類(lèi)型的類(lèi)型名稱(chēng)健爬,同時(shí)模板可以嵌套使用。例如以下的模板聲明:
//引入模板類(lèi)型T的class A
template <class T>
class A
{
...
};
//引入模板類(lèi)型K,V以及模板類(lèi)template<typename >C的class B
template<typename K, typename V, template<typename > class C>
class B
{
C<K> key;
C<V> value;
...
}
//命名沖突
class D { ... };
int p;
template<class D么介, int p>
void fun(D d)
{
D d1 = p; //j局部的class D與int p
::D d2 = ::p; //全局空間的class D與int p
}
引用C++ Primer Plus中的話(huà)娜遵,
知道這些模板不是類(lèi)和函數(shù)定義至關(guān)重要。它們是C++編譯器指令壤短,說(shuō)明了如何生成類(lèi)和成員函數(shù)的定義设拟。
通過(guò)以下代碼說(shuō)明這句話(huà)的含義:
int GlobalId = 0;
template<class T>
int GetGlobalId()
{
static int s_id = ++GlobalId;
return s_id;
}
GetGlobalId<int>(); //1
GetGlobalId<double>(); //2
GetGlobalId<char>(); //3
...
std::cout<<"char:"<<GetGlobalId<char>()<<std::endl;
std::cout<<"double:"<<GetGlobalId<double>()<<std::endl;
std::cout<<"int:"<<GetGlobalId<int>()<<std::endl;
...
//output:
3
2
1
從上面的程序可以看出,模板函數(shù)在參數(shù)指定的時(shí)候久脯,會(huì)生成對(duì)應(yīng)的結(jié)構(gòu)體蒜绽,在編譯時(shí)期完成實(shí)例化(并且對(duì)應(yīng)的類(lèi)型只會(huì)生成一次)。
2.模板特化與偏特化
特化和偏特化的含義都很簡(jiǎn)單桶现。特化是指對(duì)于模板中的模板類(lèi)型為指定類(lèi)型時(shí)采取區(qū)別的定義(實(shí)現(xiàn))方式躲雅;偏特化是指對(duì)于指定部分模板類(lèi)型的情況下,對(duì)于整個(gè)模板采用區(qū)別的定義(實(shí)現(xiàn))方式骡和,參考如下代碼:
template<class T>
void fun1(T t)
{ ... }
//為模板類(lèi)型T為char指定特化
template<>
void fun1(char t)
{ ... }
template<class A, class B>
void fun2(A a, B b)
{ ... }
//為模板類(lèi)型B為char指定偏特化
template<class A>
void fun2(A a, char b)
{ ... }
note:模板類(lèi)聲明所有部分必選全部包含在頭文件中相赁,或者使用.h include .hpp的方式。