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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

為什么不要特化函數模版

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

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。當然,base templates能夠被特化,在特化這一點上
class templatesfunction templates有很大的區別:一個class template 能夠被partially specialized and/or
fully specialized,一個function template只能被fully specialized,但是由于function templates能夠重載我們可以通過重載來實現和partially specialized 相當的功能。下面的代碼說明了這些區別:

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 

根據函數重載解析規則:

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)

上面說的這些其實都是很簡單的情況,大多數人很容易就能明白,下面的才是容易讓人弄混的:

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)

最后一行的結果像大多數人所期望的一樣,問題是:為什么期望是這個結果?
如果你期望的原因是錯誤的,接下來的一定會讓你好奇。也許你會說:"我為int*寫了一個特化版本,f(p)當然會調用c",不幸的是,這正是錯誤的原因!!!

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

如果這個結果讓你感到驚奇,那就對了!很多人都會感到驚奇!
理解這個的關鍵是:Specializations don't overload,only the base templates overload.

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

最后,應當避免特化函數模板,也要避免重載函數模板(nontemplate function的重載當然沒問題)。如果一定要這樣,可以使用如下方法模擬函數模板的偏特化:

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 2008-10-13 11:26 肥仔 閱讀(309) 評論(0)  編輯 收藏 引用 所屬分類: C++ 模板

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩天堂av| 欧美日韩成人在线| 日韩亚洲欧美在线观看| 欧美成人精品一区二区三区| 久久精品99国产精品日本| 久久精品在线观看| 久久伊人免费视频| 欧美激情一区二区三区在线 | 国产精品日韩一区二区三区| 国产精品久久久久久久久久免费看 | 日韩亚洲欧美一区二区三区| 一本久道久久综合狠狠爱| 亚洲一区免费观看| 久久国产88| 亚洲国产精品成人精品| 亚洲精品免费在线播放| 亚洲午夜久久久| 久久精品毛片| 欧美日韩黄色一区二区| 国产视频精品xxxx| 亚洲精品欧洲| 欧美一区中文字幕| 亚洲高清不卡一区| 国产一区二区黄| 老司机精品久久| 欧美日韩精品一区二区三区| 国产日韩av高清| 亚洲精品社区| 久久九九免费| 亚洲毛片在线| 久久久亚洲综合| 国产精品久久久久久久浪潮网站| 精品999久久久| 亚洲图片激情小说| 欧美aⅴ99久久黑人专区| 中国成人黄色视屏| 欧美成人精品1314www| 国产精品视频你懂的| 亚洲精品国精品久久99热一| 久久久精品动漫| 亚洲网站在线观看| 欧美激情影音先锋| 亚洲第一二三四五区| 久久九九电影| 亚洲一级免费视频| 欧美日韩在线精品| 亚洲精品久久久久| 欧美成人午夜77777| 欧美制服丝袜| 国产人成精品一区二区三| 亚洲一区免费观看| 亚洲美女中出| 欧美国产日韩精品| 亚洲欧洲精品一区二区三区波多野1战4| 欧美在线999| 亚洲一区二区在| 国产精品色午夜在线观看| 亚洲影院在线| 亚洲一区二区伦理| 国产精品久久久久毛片软件| 亚洲男人的天堂在线aⅴ视频| 99精品黄色片免费大全| 欧美屁股在线| 亚洲一二三区精品| 亚洲深夜福利| 国产嫩草影院久久久久| 午夜精品久久久久久久| 午夜精品久久久久久久| 国产综合第一页| 你懂的国产精品| 欧美freesex交免费视频| 亚洲久久视频| 妖精视频成人观看www| 国产精品久久久久久久久久久久| 亚洲一区久久| 久久精品1区| 亚洲经典一区| 99re6热只有精品免费观看 | 欧美日韩一区三区| 午夜激情综合网| 欧美在线关看| 国产欧美日韩麻豆91| 欧美在线观看一区| 国产字幕视频一区二区| 欧美va亚洲va国产综合| 欧美精品电影| 西瓜成人精品人成网站| 久久国内精品自在自线400部| 亚洲人成亚洲人成在线观看| 99精品免费网| 国产主播一区二区三区四区| 亚洲国产经典视频| 欧美视频一区二| 久久露脸国产精品| 欧美久久成人| 久久一区视频| 欧美性大战久久久久久久| 久久五月婷婷丁香社区| 欧美日韩国产成人在线| 久久久久久国产精品一区| 欧美精品aa| 久久综合五月| 国产精品久久久久久久午夜| 欧美高清视频在线播放| 国产精品毛片大码女人| 欧美激情亚洲国产| 国产伦精品一区二区三| 亚洲高清视频一区| 国产一区二区三区四区在线观看| 欧美黄色视屏| 国产在线成人| 亚洲小少妇裸体bbw| 亚洲精选在线观看| 久久久免费av| 久久成人免费视频| 国产精品久久9| 亚洲精品资源| 亚洲精品之草原avav久久| 久久激情网站| 久久福利影视| 国产精品日本一区二区| 91久久极品少妇xxxxⅹ软件| 亚洲风情在线资源站| 久久久久久久网| 久久久久久日产精品| 国产伦精品一区二区三区免费迷| 日韩亚洲一区在线播放| 99pao成人国产永久免费视频| 久久久久久久久久久一区| 久久久久久久精| 国模精品娜娜一二三区| 欧美一区二区三区免费视| 性久久久久久久久久久久| 欧美午夜无遮挡| 亚洲视频在线看| 亚洲一卡二卡三卡四卡五卡| 欧美午夜电影在线| 中文亚洲字幕| 亚洲字幕一区二区| 国产精品你懂得| 亚洲欧美一区二区激情| 欧美在线啊v一区| 国产日韩在线一区二区三区| 午夜在线观看欧美| 久久麻豆一区二区| 亚洲成在人线av| 欧美电影在线| 亚洲精选视频在线| 久久字幕精品一区| 亚洲一级片在线看| 国产精品国码视频| 亚洲一区国产一区| 久久riav二区三区| 精品成人在线观看| 老妇喷水一区二区三区| 久久蜜臀精品av| 裸体歌舞表演一区二区| 在线播放一区| 欧美另类极品videosbest最新版本| 亚洲黄色在线视频| 亚洲婷婷国产精品电影人久久| 国产精品青草综合久久久久99 | 麻豆成人av| 日韩手机在线导航| 国产精品国产三级国产专区53| 午夜久久久久久久久久一区二区| 久久精品亚洲精品| 亚洲精品乱码久久久久久按摩观 | 亚洲精品国产无天堂网2021| 欧美日韩的一区二区| 亚洲综合社区| 亚洲第一久久影院| 亚洲女同同性videoxma| 国产亚洲成av人在线观看导航 | 久久不射电影网| 日韩午夜高潮| 蜜桃久久av一区| 亚洲天堂偷拍| 伊人久久大香线| 国产精品国产自产拍高清av| 久久视频国产精品免费视频在线| 亚洲精品国产拍免费91在线| 欧美在线综合| 99精品热视频| 在线高清一区| 国产精品欧美激情| 欧美xxxx在线观看| 午夜精品久久久久久久蜜桃app| 亚洲福利国产| 久久在线免费视频| 香蕉久久国产| 一区二区高清在线观看| 樱桃国产成人精品视频| 国产精品久久久久久久久久久久| 欧美成人一区二区三区在线观看| 欧美自拍偷拍午夜视频| 亚洲伊人观看| 日韩一级在线观看| 亚洲国产cao| 欧美电影美腿模特1979在线看|