C 模板全特化 偏特化

2021-08-02 09:46:19 字數 1961 閱讀 6749

大家都對c++的模板程式設計應該都能很熟練使用了,下面就是一段很簡單不過的例子了

//模板函式

templatevoid func(t num1, n num2)

{ cout << "num1:" << num1 << ", num2:" << num2 { static bool comp(t num1, n num2)

{return (num1

特化其實就是特殊化的意思,在模板類裡,所有的型別都是模板(template),而一旦我們將所有的模板型別t都明確化,並且寫了乙個類名與主模板類名相同的類,那麼這個類就叫做全特化類。c++模板全特化之後已經失去了template的屬性了。 示例

//模板函式

templatevoid func(t num1, n num2)

{ //cout << "num1:" << num1 << ", num2:" << num2 {public:

static bool comp(t num1, n num2)

{return (num1void func(int num1, double num2)

{ cout << "num1:" << num1 << ", num2:" << num2 public:

static bool comp(int num1, double num2)

{return (num1

呼叫func(1, 2.0);

test_class::comp(1, 2.0);

注意:乙個模板被稱為全特化的條件:1.必須有乙個主模板類  2.模板型別被全部明確化

上面對主版本模板和全特化進行了定義,那麼偏特化就是介於二者之間的模板,它的模板名與主版本模板名相同,但是它的模板型中,有被明確化的部分和沒有被明確化的部分。 示例

//模板函式

templatevoid func(t num1, n num2)

{ //cout << "num1:" << num1 << ", num2:" << num2 {public:

static bool comp(t num1, n num2)

{return (num1void func(int num1, n num2)

{ cout << "num1:" << num1 << ", num2:" << num2 public:

static bool comp(int num1, double num2)

{return (num1呼叫

func(1, 2.0);

test_class::comp(1, 2.0);

注意:偏特化的條件:1.必須有乙個主模板   2.模板型別被部分明確化

對主版本模板類、全特化類、偏特化類的呼叫優先順序從高到低進行排序是:全特化類》偏特化類》主版本模板類。這樣的優先順序順序對效能也是最好的。

但是模板特化並不只是為了效能優化,更多是為了讓模板函式能夠正常工作,最典型的例子就是stl中的iterator_traits。algorithm中大多數演算法通過iterator物件來處理資料,但是同時允許以指標代替iterator物件,這是為了支援c-style array。如果直接操作iterator,那麼為了支援指標型別,每個函式都需要進行過載,因為指標沒有::value_type型別。為了解決這個問題,stl使用了iterator_traits,並為指標型別進行轉化,演算法通過它來操作iterator,不需要知道實際操作的是iterator物件還是指標。

templateclass iterator_traits

...templateclass iterator_traits...

templateclass iterator_traits...

後面兩是針對指標型別的偏特化,也是偏特化的一種常見形式。

C 模板 全特化與偏特化

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

模板的偏特化,全特化

c 中的模板分為類模板和函式模板 模板的特化分為倆種 全特化和偏特化 全特化 舉乙個簡單的例子 可以發現,ab呼叫的是我們全特化後的版本,而aa呼叫的是原始版本。偏特化 偏特化又稱為區域性特化,全特化是對所有的模板引數進行特化,偏特化是對區域性的引數特化 乙個簡單的例子 templateclass ...

C 模板特化 偏特化

注意 特化時模板引數的先後順序不能變 特化是基於泛化版本進行的 函式模板特化過載與函式過載不衝突 函式模板只能全特化不能偏特化 模板類泛化 templateclass mytest int m func 模板類全特化 template class mytest 模板類偏特化 templateclas...