C 全特化與偏特化

2021-08-29 07:28:33 字數 1264 閱讀 7027

c++中用模板來實現**的復用,模板分為類模板與函式模板,雖然模板引進到c++中的時間不長,可是卻在很多方面有很多的應用,比如標準模板庫stl中就有很多應用,然而當我們仔細的學習stl就會發現其中的模板充斥著很多的全特化與偏特化模板,那麼什麼是特化模板呢?

我們前面學習了模板知道了編譯的時候編譯器可以根據型別的不同例項化出不同的物件,可是如果有乙個型別有更好的解決方案那麼這個型別就可以不用這個模板,我們可以給這個型別設計乙個新的解決方案,這種方式叫做特化。

特化分為全特化與偏特化,接下來我們先來看全特化

全特化就是對所有模板引數進行特化,當適配到相應的型別的時候直接按照特化版執行。

我們來看乙個例子

#include#include#includeusing namespace std;

templateclass a

};template<>

class a

};int main()

在上面這段**中,第乙個是對所有模板都適用的,第二個則是int的特化版本,那麼當我們用其他型別進行例項化的時候會執行普通版本,當我們用int例項化的時候則會執行int特化版本

執行結果符合預期

接下來讓我們來看偏特化,首先還是先根據乙個例子來看

#include#include#includeusing namespace std;

templateclass a

t1 _a;

t2 _b;

}; templateclass a

t _a;

int _b;

};int main()

在這段**中我們定義了乙個適用於所有型別的版本,同時也定義了乙個第二個型別是int的版本,我們來看看結果

結果可以看出,當我們第二個引數給成int的話他會自己去執行偏特化版本,這裡我們可以總結出偏特化與全特化的乙個區別,全特化中所有的模板型別都給定才可以執行全特化版本,但是偏特化我們可以只給定有限的模板型別即可。

那我們來看看下面這兩種情況呢

templateclass a

t1& _a;

t2& _b;

}; templateclass a

t1* _a;

t2* _b;

};

這些其實都是偏特化,偏特化不是指對於部分型別進行限制,而是對引數模板更進一步的進行限制所形成的乙個特化版本。

這裡要注意乙個事項:所有的特化都是在模板的基礎上實現的。

C 模板 全特化與偏特化

模板 模板定義 模板就是實現 重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數,從而實現了真正的 可重用性。模版可以分為兩類,乙個是函式模版,另外乙個是類模版。大白話 c 是一門強型別語言,編寫一段通用的邏輯,可以把任意型別的變數傳進去處理,通過把通用邏輯設計為模板,擺脫了型別的限制,極...

STL全特化與偏特化

在泛型程式設計中,常常會使用一些非完全泛型的類模板,這就是特化。如何理解全特化呢?如上圖所示,第乙個template class是空間配置器的類模板,第二個就是乙個全特化的template class。全特化是為了節省時間或空間而重寫的一種類模板。你可以這樣理解,乙個類模板,它在正常情況下都會正常使...

C 模板全特化 偏特化

大家都對c 的模板程式設計應該都能很熟練使用了,下面就是一段很簡單不過的例子了 模板函式 templatevoid func t num1,n num2 cout num1 num1 num2 num2 static bool comp t num1,n num2 return num1 特化其實就...