天天看點

C++中函數模闆與類模闆、模闆類與類模闆、模闆函數與函數模闆的差別

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 &lt; i n t &gt; Vector&lt;int&gt; Vector<int>、 V e c t o r &lt; c h a r &gt; Vector&lt;char&gt; Vector<char>、 V e c t o r &lt; V e c t o r &lt; i n t &gt; &gt; Vector&lt; Vector&lt;int&gt; &gt; Vector<Vector<int>>、 V e c t o r &lt; S h a p e ∗ &gt; … … Vector&lt;Shape*&gt;…… Vector<Shape∗>……。

模闆類的重點是類。表示的是由一個模闆生成而來的類。例子:

上面的 V e c t o r &lt; i n t &gt; 、 V e c t o r &lt; c h a r &gt; 、 … … Vector&lt;int&gt;、Vector&lt;char&gt;、…… 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 &lt; i n t &gt; 、 f u n &lt; d o u b l e &gt; 、 f u n &lt; S h a p e ∗ &gt; … … fun&lt;int&gt;、fun&lt;double&gt;、fun&lt;Shape*&gt;…… 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 &lt; i n t &gt; 、 f u n &lt; S h a p e ∗ &gt; … … fun&lt;int&gt;、fun&lt;Shape*&gt;…… fun<int>、fun<Shape∗>……都是模闆函數。

參考:模闆類與類模闆、函數模闆與模闆函數等的差別