模版特化和作為萃取器的應用

2021-10-08 18:13:51 字數 4495 閱讀 9548

模版大致分為三種版本:普通版本、部分特化版本、全部特化版本。

普通版本:

template

<

class

type

>

void

function

(type t)

部分特化版本:

template

<

class

type

>

void

function

(type *t)

全部特化版本:

template

<

>

void function<

int>

(int t)

其中,全部特化版本只能接受一種引數,範圍最小;部分特化版本可以接受一類特定的引數,範圍較大;普通版本可以接受任何引數,範圍最大。

模版的匹配規則如下:

全部特化版本 ----> 部分特化版本 ----> 普通版本

(高優先順序)----------------------------->(低優先順序)

如何做到原生指標和迭代器有相同的功能呢?

1.製作類模版萃取器。

//iterator_trait是模版類,由三個版本組成:乙個普通版本,兩個部分特化版本(用來萃取原生指標)

//作用是萃取器,放進去任意型別,萃取出相應的5個型別

template

<

class

it>

class

iterator_trait

;template

<

class

it>

class

iterator_trait

>

;template

<

class

it>

class

iterator_trait

<

const it *

>

;

2.製作函式模版萃取器。

//用函式模版當萃取器,只萃取迭代器型別

template

<

class

it>

typename it::iterator_category iterator_trait

(const it &

)template

<

class

it>

random_iterator_flag iterator_trait

(it *

)template

<

class

it>

random_iterator_flag iterator_trait

(const it *

)//利用萃取器,列印迭代器自身型別

template

<

class

it>

void

print_iterator_type

(it _it)

用萃取器的乙個例子(類模版):

typedef

int distance_t;

//下面5個是五種迭代器型別的標誌,用來區分迭代器型別

class

input_iterator_flag

;class

output_iterator_flag

;class

forward_iterator_flag

:public input_iterator_flag

;class

bidirectional_iterator_flag

:public forward_iterator_flag

;class

random_iterator_flag

:public bidirectional_iterator_flag

;//迭代器類的基類

template

<

class

category

,class

type

,class

diff

= distance_t,

class

ptr= type *

,class

refer

= type &

>

class

iterator

;//五種迭代器,由基類派生,標籤不同,用來區分迭代器自身型別

template

<

class

type

,class

distance

>

class

input_iterator

:public iterator

;template

<

class

type

,class

distance

>

class

output_iterator

:public iterator

;template

<

class

type

,class

distance

>

class

forward_iterator

:public iterator

;template

<

class

type

,class

distance

>

class

bidirectional_iterator

:public iterator

;template

<

class

type

,class

distance

>

class

random_iterator

:public iterator

;template

<

class

type

>

class

my_vector

;class

iterator

:public const_iterator;}

;template

<

class

type

>

class

my_list

;class

iterator

:public const_iterator;}

;//iterator_trait是模版類,由三個版本組成:乙個普通版本,兩個部分特化版本(用來萃取原生指標)

//作用是萃取器,放進去任意型別,萃取出相應的5個型別

template

<

class

it>

class

iterator_trait

;template

<

class

it>

class

iterator_trait

>

;template

<

class

it>

class

iterator_trait

<

const it *

>

;void

my_print_type

(input_iterator_flag)

void

my_print_type

(output_iterator_flag)

void

my_print_type

(forward_iterator_flag)

void

my_print_type

(bidirectional_iterator_flag)

void

my_print_type

(random_iterator_flag)

//利用萃取器,列印迭代器自身型別

template

<

class

it>

void

print_iterator_type

(it _it)

intmain()

;print_iterator_type

(vector_it)

;print_iterator_type

(list_it)

;print_iterator_type

(ary)

;return0;

}

這樣,在編譯時就能確定呼叫哪種版本的函式,比在執行時判斷,效率提高了。

模版的特化和偏特化

模版的特化與偏特化 模板為什麼要特化,因為編譯器認為,對於特定的型別,如果你能對某一功能更好的實現,那麼就該聽你的。模板分為類模板與函式模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體型別,偏特化就是如果這個模板有多個型別,那麼只限定其中的一部分。partial template spe...

型別萃取 模板類的特化的應用

一 函式模板的特化 1 需要先有乙個模板函式 templatet max t left,t right 這種方式不能傳字串,需要進行特化 特化 char template max這個整體是函式的名字 char max char left,char right 二 模板類裡面的特化 1 全特化 把模板...

C 中的特化問題和型別萃取問題

型別萃取 從字面上來解釋,就是為已有的模板引數進行一些使其特殊化的指定,使得以前不受任何約束的模板引數,或受到特定的修飾 例如const或者搖身一變成為了指標,甚至是經過別的模板類包裝之後的模板型別 或完全被指定了下來。就是模板中模板引數全被指定為確定的型別。全特化也就是定義了乙個全新的型別,全特化...