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

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 肥仔 閱讀(311) 評論(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>
            亚洲精品综合精品自拍| 国产精品高潮呻吟| 午夜精品www| 欧美成人亚洲成人日韩成人| 欧美一区二区视频观看视频| 欧美日韩日本视频| 亚洲国产精品成人综合色在线婷婷 | 久久久久久久久久久一区| 亚洲一区二区三区视频播放| 免费日韩视频| 乱码第一页成人| 国产日韩欧美亚洲一区| 亚洲一区观看| 亚洲欧美日本在线| 国产精品电影网站| 亚洲最新视频在线| 亚洲天堂黄色| 欧美日韩一区二区国产| 91久久国产综合久久91精品网站| 亚洲韩国一区二区三区| 久久久99国产精品免费| 久久综合影视| 一区在线影院| 久久亚洲精品中文字幕冲田杏梨| 巨乳诱惑日韩免费av| 在线播放亚洲一区| 久久综合久久综合久久| 欧美黄在线观看| 亚洲国产精品一区制服丝袜| 猛男gaygay欧美视频| 欧美激情a∨在线视频播放| 亚洲国产一二三| 欧美国产欧美亚洲国产日韩mv天天看完整| 女人天堂亚洲aⅴ在线观看| 亚洲国产高清在线| 欧美成在线观看| 日韩一本二本av| 亚洲欧美999| 国产目拍亚洲精品99久久精品| 欧美一区二区免费| 免费不卡在线观看av| 亚洲三级国产| 欧美午夜一区二区| 小黄鸭精品密入口导航| 巨乳诱惑日韩免费av| 亚洲日韩成人| 国产精品久久午夜夜伦鲁鲁| 午夜精品久久久久久久久久久久| 久久久久久久网| 亚洲精品小视频在线观看| 欧美日韩一区二区三| 午夜天堂精品久久久久| 男同欧美伦乱| 这里只有精品视频在线| 国产亚洲一区在线| 欧美a一区二区| 亚洲欧美日韩国产一区二区三区| 可以看av的网站久久看| 在线视频你懂得一区二区三区| 国产视频久久久久久久| 欧美激情一区二区三区高清视频 | 久久久久国产精品www| 亚洲国产精品一区在线观看不卡| 亚洲一区二区三区成人在线视频精品 | 欧美人交a欧美精品| 亚洲一区二区三区在线看 | 久久精品国产成人| 亚洲精品日日夜夜| 国产欧美一区二区视频| 欧美激情 亚洲a∨综合| 欧美一区二区三区日韩| 亚洲精品视频免费在线观看| 久久久亚洲欧洲日产国码αv | 欧美一区二区三区在线| 亚洲日本中文字幕区| 国产精品综合av一区二区国产馆| 美女视频网站黄色亚洲| 午夜精彩国产免费不卡不顿大片| 欧美国产在线视频| 亚洲欧美在线一区二区| 亚洲美女免费精品视频在线观看| 国产午夜精品美女视频明星a级 | 狠狠狠色丁香婷婷综合激情| 欧美日韩综合在线| 欧美本精品男人aⅴ天堂| 香港成人在线视频| 亚洲精品视频在线播放| 欧美电影免费观看大全| 久久精品国产综合精品| 亚洲一区免费网站| 一区二区三区色| 亚洲三级观看| 亚洲国产小视频在线观看| 国产亚洲精品久久久久动| 国产精品第2页| 欧美不卡高清| 男人天堂欧美日韩| 久热精品在线视频| 久久久久久国产精品一区| 欧美一级片在线播放| 亚洲图片欧美午夜| 亚洲视频香蕉人妖| 一本色道久久99精品综合| 亚洲肉体裸体xxxx137| 亚洲国产精品va在线观看黑人| 欧美 日韩 国产在线| 鲁大师影院一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 久久综合九色九九| 免费成人av| 欧美国产日韩一区二区在线观看| 欧美成人免费小视频| 欧美成年网站| 亚洲黄色性网站| 亚洲欧洲精品一区二区三区不卡| 亚洲国产欧美一区| 亚洲精选在线| 一本久久a久久精品亚洲| 夜夜嗨一区二区| 亚洲一区二区三区涩| 亚洲一区二区成人| 欧美一区2区三区4区公司二百| 欧美一乱一性一交一视频| 久久久在线视频| 欧美激情欧美激情在线五月| 欧美日韩妖精视频| 国产欧美一区二区三区沐欲 | 欧美在线视频在线播放完整版免费观看| 亚洲欧美日韩中文播放| 久久精品盗摄| 欧美激情第10页| 国产精品久久久久高潮| 国产一区91| 亚洲九九九在线观看| 亚洲网在线观看| 久久精品亚洲一区二区| 欧美电影资源| 99re热这里只有精品免费视频| 亚洲欧美影院| 美女日韩在线中文字幕| 欧美午夜一区二区| 国产综合色在线视频区| 亚洲美女毛片| 久久久国产精品一区| 亚洲国产岛国毛片在线| 亚洲免费在线播放| 葵司免费一区二区三区四区五区| 欧美三级中文字幕在线观看| 国产一区二区三区成人欧美日韩在线观看| 亚洲高清一区二| 午夜亚洲福利| 亚洲国产精彩中文乱码av在线播放| 中文在线一区| 蜜臀a∨国产成人精品| 国产精品白丝jk黑袜喷水| 1769国产精品| 欧美一区中文字幕| 日韩视频在线一区二区三区| 久久国产色av| 欧美日韩国产欧| 亚洲成人在线网| 欧美制服丝袜第一页| 日韩视频在线一区| 久久综合色婷婷| 国产区亚洲区欧美区| 一本久久a久久精品亚洲| 久久人人爽人人爽爽久久| 国产精品99久久久久久久久久久久| 久久免费国产| 国产一区二区高清视频| 亚洲欧美精品在线观看| 亚洲国产小视频| 久久久噜噜噜久久人人看| 国产精品亚洲欧美| 亚洲一区在线直播| 亚洲人成在线播放| 欧美成人按摩| 在线观看91精品国产入口| 久久九九免费视频| 亚洲免费在线观看| 国产精品a久久久久久| 中文精品视频一区二区在线观看| 欧美大片免费久久精品三p| 久久久激情视频| 国产亚洲精品久久久| 久久国产精品久久久久久| 亚洲天堂av在线免费| 欧美日韩福利| 亚洲视频一起| 99视频一区| 欧美视频在线观看一区| 亚洲一区二区av电影| 一区二区三区www| 国产精品r级在线| 亚洲永久免费观看| 亚洲永久在线观看| 国产欧美日韩视频在线观看| 久久精品道一区二区三区| 欧美在线黄色| 怡红院精品视频|