模版大致分為三種版本:普通版本、部分特化版本、全部特化版本。
普通版本:
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或者搖身一變成為了指標,甚至是經過別的模板類包裝之後的模板型別 或完全被指定了下來。就是模板中模板引數全被指定為確定的型別。全特化也就是定義了乙個全新的型別,全特化...