青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

#ant

The dreams in which I'm dying are the best I've ever had...

為什么不要特化函數(shù)模版

Overloading vs. Specialization

在C++中有class templatesfunction templates,這兩種模版有很多區(qū)別,最重要的區(qū)別就是重載(overloading):
普通的C++類不能重載,當(dāng)然類模版也不能重載;相反,普通函數(shù)可以重載,函數(shù)模版也能重載。這再正常不過(guò),看下面的代碼:

?1?// ?Example?1:?Class?vs.?function?template,?and?overloading?
?2?//

?3?
?4?//?A?class?template
?5?template<class?T>?class?X?{?/*...*/?};??????// ?(a)
?6?

?7?//?A?function?template?with?two?overloads
?8?template<class?T>?void?f(?T?);??????????????//?(b)
?9?template<class?T>?void?f(?int,?T,?double?);?// ?(c)
10?

像上面未特化的模板通常叫做base templates。當(dāng)然,base templates能夠被特化,在特化這一點(diǎn)上
class templatesfunction templates有很大的區(qū)別:一個(gè)class template 能夠被partially specialized and/or
fully specialized,一個(gè)function template只能被fully specialized,但是由于function templates能夠重載我們可以通過(guò)重載來(lái)實(shí)現(xiàn)和partially specialized 相當(dāng)?shù)墓δ?。下面的代碼說(shuō)明了這些區(qū)別:

?1?// ?Example?1,?continued:?Specializing?templates?
?2?//

?3?
?4?//?A?partial?specialization?of?(a)?for?pointer?types?
?5?template<class?T>?class?X<T*>?{?/*...*/ ?};
?6?

?7?//?A?full?specialization?of?(a)?for?int?
?8?template<>?class?X<int>?{?/*...*/ ?};
?9?

10?// ?A?separate?base?template?that?overloads?(b)?and?(c)?
11?//
?--?NOT?a?partial?specialization?of?(b),?because?
12?//
?there's?no?such?thing?as?a?partial?specialization?
13?//?of?a?function?template!?

14?template<class?T>?void?f(?T*?);?????????????// ?(d)
15?

16?//?A?full?specialization?of?(b)?for?int?
17?template<>?void?f<int>(?int?);??????????????// ?(e)
18?

19?// ?A?plain?old?function?that?happens?to?overload?with?
20?//
?(b),?(c),?and?(d)?--?but?not?(e),?which?we'll?
21?//?discuss?in?a?moment?

22?void?f(?double?);???????????????????????????// ?(f)
23?

根據(jù)函數(shù)重載解析規(guī)則:

?1?// ?Example?1,?continued:?Overload?resolution?
?2?//?

?3? bool?b;?
?4?int
?i;?
?5?double
?d;
?6?

?7?f(?b?);????????//?calls?(b)?with?T?=?bool?
?8?f(?i,?42,?d?);?//?calls?(c)?with?T?=?int?
?9?f(?&i?);???????//?calls?(d)?with?T?=?int?
10?f(?i?);????????//?calls?(e)?
11?f(?d?);????????//?calls?(f)

上面說(shuō)的這些其實(shí)都是很簡(jiǎn)單的情況,大多數(shù)人很容易就能明白,下面的才是容易讓人弄混的:

1.考慮如下代碼:

?1?// ?Example?2:?Explicit?specialization?
?2?//?

?3?template<class?T>?//?(a)?a?base?template?
?4?void ?f(?T?);
?5?

?6?template<class?T>?//?(b)?a?second?base?template,?overloads?(a)?
?7?void?f(?T*?);?????// ?????(function?templates?can't?be?partially?
?8???????????????????//?????specialized;?they?overload?instead)

?9?
10?template<>????????//?(c)?explicit?specialization?of?(b)?
11?void?f<>(int* );
12?

13?//?...
14?
15?int?* p;?
16?f(?p?);???????????//?calls?(c)

最后一行的結(jié)果像大多數(shù)人所期望的一樣,問(wèn)題是:為什么期望是這個(gè)結(jié)果?
如果你期望的原因是錯(cuò)誤的,接下來(lái)的一定會(huì)讓你好奇。也許你會(huì)說(shuō):"我為int*寫(xiě)了一個(gè)特化版本,f(p)當(dāng)然會(huì)調(diào)用c",不幸的是,這正是錯(cuò)誤的原因!!!

2.再考慮下面的代碼:

?1?// ?Example?3
?2?//?

?3?template<class?T>?//?(a)?same?old?base?template?as?before?
?4?void ?f(?T?);
?5?

?6?template<>????????//?(c)?explicit?specialization,?this?time?of?(a)
?7?void?f<>(int* );
?8?

?9?template<class?T>?//?(b)?a?second?base?template,?overloads?(a)?
10?void?f(?T* ?);
11?

12?//?...
13?
14?int?* p;?
15?f(?p?);???????????//
?calls?(b)!?overload?resolution?ignores?
16???????????????????//
?specializations?and?operates?on?the?base?
17???????????????????//?function?templates?only

如果這個(gè)結(jié)果讓你感到驚奇,那就對(duì)了!很多人都會(huì)感到驚奇!
理解這個(gè)的關(guān)鍵是:Specializations don't overload,only the base templates overload.

重載解析僅僅選擇base template(或者nontemplate function,如果有的話),只有當(dāng)編譯器已經(jīng)決定了哪個(gè)
base template將會(huì)被選擇,編譯器才會(huì)繼續(xù)往下尋找適合的特化版本,如果找到了就使用那個(gè)特化版本。

最后,應(yīng)當(dāng)避免特化函數(shù)模板,也要避免重載函數(shù)模板(nontemplate function的重載當(dāng)然沒(méi)問(wèn)題)。如果一定要這樣,可以使用如下方法模擬函數(shù)模板的偏特化:

?1?//base?template?class,?
?2?template?<class?T>
?3? struct?FuncImpl?{
?4?????//users,?go?ahead?and?specialize?this

?5?????static?int?apply(const?T?& t)?{
?6?????????return?0
;
?7?
????}
?8?
};
?9?

10?//partial?specialazation?for?int
11?template?<>
12?struct?FuncImpl<int> ?{
13?????static?int?apply(int
?t)?{
14?????????return?1
;
15?
????}
16?
};
17?

18?//partial?specialazation?for?T*
19?template?<class?T>
20?????struct?FuncImpl<T?*> ?{
21?????static?int?apply(T?*
t)?{
22?????????return?2
;
23?
????}
24?
};
25?

26?//users,?don't?touch?this!
27?template?<class?T>
28?int?func(const?T?& t)?{
29?????return?FuncImpl<T>
::apply(t);
30?
}
31?

32?int?i?=?10 ,?r;
33?r?=?func('c');?//r?=?0

34?r?=?func(8);?//r?=?1
35?r?=?func(&i);?//r?=?2

posted on 2007-08-30 13:55 螞蟻終結(jié)者 閱讀(4198) 評(píng)論(4)  編輯 收藏 引用 所屬分類: C++

Feedback

# re: 為什么不要特化函數(shù)模版 2007-08-30 16:54 minidxer

不錯(cuò)  回復(fù)  更多評(píng)論   

# re: 為什么不要特化函數(shù)模版 2007-08-31 09:01 calmman

不錯(cuò)!  回復(fù)  更多評(píng)論   

# re: 為什么不要特化函數(shù)模版 2007-09-03 13:16 ymmol

如果那個(gè)特化函數(shù)有交代清楚,那就沒(méi)那么多問(wèn)題了:
template<>
void f<int>(int arg){
//...
}

template<>
void f<int *>(int *arg){
//...
}

在調(diào)用時(shí)寫(xiě)清楚也會(huì)少些疑惑:
int ia=1;
f<int>(ia);
f<int *>(&ia);
所以我覺(jué)得重載或特化都可以,只要你寫(xiě)清楚了,都沒(méi)事  回復(fù)  更多評(píng)論   

# re: 為什么不要特化函數(shù)模版 2007-09-03 17:08 螞蟻終結(jié)者

@ymmol
是啊,不過(guò)有像我這樣懶的程序員,習(xí)慣了將參數(shù)推導(dǎo)交給編譯器,也習(xí)慣了make_pair類似的寫(xiě)法。  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产裸拍裸体视频在线观看乱了中文 | 国产字幕视频一区二区| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲尤物在线| 亚洲天堂成人| 亚洲欧美日韩精品久久久| 在线一区二区三区四区| 亚洲视频你懂的| 亚洲一区日韩| 欧美一区二区在线观看| 久久久久综合| 欧美激情精品久久久久| 欧美日本一区二区视频在线观看| 欧美日韩国产123| 国产精品福利影院| 国产一区二区三区久久久| 在线成人性视频| 99精品国产在热久久下载| 亚洲视频电影图片偷拍一区| 宅男噜噜噜66国产日韩在线观看| 国产精品视区| 亚洲一二三区精品| 亚洲视频导航| 欧美一级视频精品观看| 久久午夜精品| 欧美日韩免费在线| 国产一区观看| 亚洲九九爱视频| 亚洲欧美日韩一区在线| 性高湖久久久久久久久| 久久亚裔精品欧美| 亚洲日本欧美在线| 亚洲欧美成人在线| 欧美国产先锋| 国产主播精品| 亚洲欧美日韩在线观看a三区 | 久久久精品国产99久久精品芒果| 欧美成人在线网站| 亚洲欧洲av一区二区| 欧美日本精品| 亚洲国产欧美国产综合一区 | 亚洲人成啪啪网站| 久久精品最新地址| 国产精品尤物福利片在线观看| 亚洲第一福利视频| 欧美资源在线| 一区二区av在线| 欧美顶级大胆免费视频| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 欧美一区二区黄色| 欧美高清hd18日本| 麻豆久久婷婷| 欧美日韩亚洲一区二| 国产精一区二区三区| 欧美国产一区视频在线观看 | 欧美国产日韩在线| 欧美成人中文字幕在线| 久久青青草原一区二区| 亚洲老司机av| 久久综合精品国产一区二区三区| 国产精品s色| 亚洲人成亚洲人成在线观看图片| 性欧美xxxx大乳国产app| 欧美电影免费观看| 亚洲欧美中文另类| 欧美日韩精品一区| 亚洲人成网站在线播| 亚洲一区二区三区欧美| 欧美精品18+| 亚洲一区精品视频| 欧美黄污视频| 激情丁香综合| 欧美一区二区啪啪| 亚洲日产国产精品| 久久九九99视频| 国产欧美精品一区二区色综合 | 男女激情久久| 一区二区三区在线高清| 久久手机免费观看| 中文一区二区| 国产精品视频yy9299一区| 亚洲视频在线观看三级| 亚洲精选在线观看| 欧美精品18+| 亚洲三级影院| 久久黄色小说| 午夜精品福利在线| 欧美日韩极品在线观看一区| 亚洲欧洲一区二区在线观看 | 黄色av一区| 亚洲一区三区视频在线观看| 亚洲一品av免费观看| 国产精品久久久久久久久久三级 | 国产女主播一区二区三区| 午夜伦欧美伦电影理论片| 亚洲午夜视频在线| 国产日韩精品电影| 久久免费视频这里只有精品| 欧美专区一区二区三区| 影音先锋亚洲精品| 欧美国产综合视频| 欧美激情亚洲激情| 亚洲一区综合| 欧美一区视频在线| 亚洲大胆av| 亚洲国产欧美在线人成| 欧美三区在线视频| 欧美一区二区日韩| 久久国产精品一区二区三区四区 | 久久精品成人一区二区三区蜜臀 | 在线成人小视频| 久久久久9999亚洲精品| 久久久久久电影| 久久免费视频观看| 一区二区三区成人精品| 亚洲午夜久久久久久尤物| 欧美亚洲三区| 亚洲一区二区高清| 久久久av网站| 中文精品一区二区三区| 亚洲欧美激情四射在线日| 伊人天天综合| 中文在线不卡| 亚洲高清激情| 亚洲永久视频| 亚洲精品视频在线观看网站| 久久九九免费视频| 亚洲伊人伊色伊影伊综合网| 久久久久久9| 亚洲欧美www| 蜜桃久久精品一区二区| 久久久99久久精品女同性| 欧美国产视频日韩| 女同性一区二区三区人了人一 | 国产日韩欧美黄色| 欧美福利视频在线| 国产乱码精品一区二区三区不卡| 美女精品自拍一二三四| 欧美日韩在线影院| 欧美韩国日本综合| 国产主播一区二区三区| 亚洲国产精品一区二区www在线 | 在线日韩电影| 午夜精品久久久久久久99热浪潮 | 欧美日韩国产系列| 噜噜噜噜噜久久久久久91 | 韩日精品中文字幕| 亚洲调教视频在线观看| 亚洲精品日韩在线观看| 久久精品国产第一区二区三区最新章节 | 亚洲三级视频| 亚洲国内欧美| 久久久久这里只有精品| 欧美在线亚洲| 国产精品一区二区黑丝| 亚洲毛片在线观看| 亚洲精选中文字幕| 欧美成人午夜激情| 亚洲影院色无极综合| 国产精品99久久久久久久女警| 亚洲激情图片小说视频| 久久激情视频免费观看| 欧美中文字幕在线观看| 国产精品久久久久久一区二区三区| 亚洲人屁股眼子交8| 亚洲精品久久久久| 免费观看成人鲁鲁鲁鲁鲁视频| 久久尤物电影视频在线观看| 国产一区成人| 久久国产夜色精品鲁鲁99| 久久久国产精品一区二区三区| 欧美成人视屏| 久久久99久久精品女同性| 亚洲高清电影| 欧美国产日韩一区二区| 亚洲大胆视频| 亚洲美女色禁图| 欧美日韩在线播放一区| 亚洲网在线观看| 久久久精彩视频| 一区二区三区自拍| 欧美大片免费看| 一区二区三区欧美在线| 欧美一区2区视频在线观看| 美女爽到呻吟久久久久| 久久精品亚洲国产奇米99| 海角社区69精品视频| 久久噜噜噜精品国产亚洲综合| 亚洲电影第三页| 亚洲综合99| 黄色成人在线| 欧美绝品在线观看成人午夜影视 | 国产精品亚洲综合久久| 久久精品视频va| 91久久久久| 欧美一区亚洲| 亚洲精品中文字幕女同| 国产精品尤物福利片在线观看| 久久免费精品日本久久中文字幕| 亚洲高清在线观看一区|