1.函數模闆與類模闆的差別
相同點:
- 1.以關鍵字template開始,後跟一個模闆參數清單
- 2.兩者定義的類型參數目的相同,都是将資料的類型參數化
不同點:
- 1.函數模闆的執行個體化是由編譯程式在處理函數調用時自動完成的;而類模闆的執行個體化必須由程式員在程式中顯式地指定。即函數模闆允許隐式調用和顯式調用,而類模闆隻能顯示調用
2.類模闆——模闆類(class template——template class)
類模闆的重點是模闆。表示的是一個模闆,專門用于産生類的模子。例子:
template <typename T>
class Vector
{
...
};
使用這個 V e c t o r Vector Vector模闆就可以産生很多的 c l a s s class class(類), V e c t o r < i n t > Vector<int> Vector<int>、 V e c t o r < c h a r > Vector<char> Vector<char>、 V e c t o r < V e c t o r < i n t > > Vector< Vector<int> > Vector<Vector<int>>、 V e c t o r < S h a p e ∗ > … … Vector<Shape*>…… Vector<Shape∗>……。
模闆類的重點是類。表示的是由一個模闆生成而來的類。例子:
上面的 V e c t o r < i n t > 、 V e c t o r < c h a r > 、 … … Vector<int>、Vector<char>、…… Vector<int>、Vector<char>、……全是模闆類。
3.函數模闆——模闆函數(function template——template function)
函數模闆的重點是模闆。表示的是一個模闆,專門用來生産函數。例子:
template <typename T>
void fun(T a)
{
...
}
在運用的時候,可以顯式( e x p l i c i t l y explicitly explicitly)生産模闆函數, f u n < i n t > 、 f u n < d o u b l e > 、 f u n < S h a p e ∗ > … … fun<int>、fun<double>、fun<Shape*>…… fun<int>、fun<double>、fun<Shape∗>……。
也可以在使用的過程中由編譯器進行模闆參數推導,幫你隐式( i m p l i c i t l y implicitly implicitly)生成。
fun(6);//隐式生成fun<int>
fun(8.9);//隐式生成fun<double>
fun(‘a’);// 隐式生成fun<char>
Shape* ps = new Cirlcle;
fun(ps);//隐式生成fun<Shape*>
模闆函數的重點是函數。表示的是由一個模闆生成而來的函數。例子:
上面顯式( e x p l i c i t l y explicitly explicitly)或者隐式( i m p l i c i t l y implicitly implicitly)生成的 f u n < i n t > 、 f u n < S h a p e ∗ > … … fun<int>、fun<Shape*>…… fun<int>、fun<Shape∗>……都是模闆函數。
參考:模闆類與類模闆、函數模闆與模闆函數等的差別