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

posts - 18,  comments - 104,  trackbacks - 0


今天閑來無事,實現了一個簡版的boost::tuple作為練習,貼出來,僅供參考。

為了看起來清晰,tuple只支持3個參數,只要在注釋為A的地方繼續增加模板參數和構造函數的參數個數,就可以增加tuple元素的個數。
沒有type_trait,只為清晰,可讀。加了一點注釋,其中“遞歸”二字有時候說的不恰當,因為看似一個函數,實則不是一個函數。
仔細讀代碼吧。
輕拍

  1 // 空類型,作為type_list的結束標記。
  2 
  3 struct null_type
  4 {
  5     // 在tuple鏈的最尾端,構造一個null_type,對應type_list尾端的null_type.
  6     null_type()
  7     {}
  8 
  9     // 這個構造函數完全是為了簡化cons的構造函數,其實是個“遞歸”結束條件。  A
 10     template <class T1, class T2, class T3, class T4>
 11     null_type(const T1& t1, const T2& t2, const T3& t3, const T4& t4)
 12     {}
 13 };
 14 
 15 // type_list + data_list聲明。
 16 template <typename HH, typename TT>
 17 struct cons;
 18 
 19 // 用于在type_list中找到第N個類型,下標從1開始。
 20 template <int N, typename _T>
 21 struct element
 22 {
 23     typedef typename element<N-1, typename _T::tail_type>::type type;
 24 };
 25 
 26 // 所以特化為1,要是想從0開始,就特化0.
 27 template <typename _T>
 28 struct element<1, _T>
 29 {
 30     typedef typename _T::head_type type;
 31 };
 32 
 33 // 得到第N個類型對于的數據,注意是遞歸調用,對于不同的get_class<N>::get, get_class<N-1>::get  一直到 get_class<1>::get。
 34 template <int N>
 35 struct get_class
 36 {
 37     template <typename RET, typename HH, typename TT>
 38     static RET get(cons<HH, TT>& c)
 39     {
 40         return get_class<N-1>::get<RET>(c.tail);
 41     }
 42 };
 43 
 44 // 下標依然從1開始。
 45 template <>
 46 struct get_class<1>
 47 {
 48     template <typename RET, typename HH, typename TT>
 49     static RET get(cons<HH, TT>& c)
 50     {
 51         return c.head;
 52     }
 53 };
 54 
 55 // 繼續包裝,為了方便使用,得到第N個類型對應的數據。
 56 template <int N, typename HH, typename TT>
 57 typename element<N, cons<HH, TT> >::type&
 58 get(cons<HH, TT>& c)
 59 {
 60     return get_class<N>::get<element<N, cons<HH, TT> >::type&>(c);
 61 }
 62 
 63 // type_list + data_list 的定義。
 64 template <typename HH, typename TT>
 65 struct cons
 66 {
 67     typedef HH head_type;
 68     typedef TT tail_type;
 69 
 70     head_type head;
 71     tail_type tail;
 72 
 73     // 構造函數,注意遞歸構造,遞歸結束條件是null_type的構造函數。  A
 74     template <class T1, class T2, class T3>
 75     cons( T1& t1, T2& t2, T3& t3, null_type)
 76         : head (t1),
 77         tail (t2, t3, null_type(), null_type())
 78     {}
 79 
 80     // 包裝的get方法,其實質還是調用全局的get,參數為*this。
 81     template <int N>
 82     typename element<N, cons<HH, TT> >::type
 83         get()
 84     {
 85         return ::get<N>(*this);
 86     }
 87 };
 88 
 89 // 構造type_list.主要是為了將序列式的模板參數轉化成type_list的樣子。  A
 90 template <class T0, class T1, class T2>
 91 struct map_tuple_to_cons
 92 {
 93     typedef cons<T0, typename map_tuple_to_cons<T1, T2, null_type>::type> type;
 94 };
 95 // 停止條件。
 96 template <>
 97 struct map_tuple_to_cons<null_type, null_type, null_type>
 98 {
 99     typedef null_type type;
100 };
101 
102 // 包裝成tuple,其實就是一個type_list + data_list.                   A
103 template <class T0, class T1 = null_type, class T2 = null_type>    
104 struct tuple : public map_tuple_to_cons<T0, T1, T2>::type
105 {
106     typedef typename map_tuple_to_cons<T0, T1, T2>::type base;
107 
108     tuple(const T0& t0) : base(t0, null_type(), null_type(), null_type())
109     {
110     };
111 
112     tuple(const T0& t0, const T1& t1) : base(t0, t1, null_type(),
113         null_type())
114     {
115     };
116 
117     tuple(const T0& t0, const T1& t1, const T1& t2) : base(t0, t1, t2,
118         null_type())
119     {
120     };
121 };
122 
123 // test.
124 int main()
125 {
126     tuple<int> x(3);
127     tuple<doubleint> y(5.42);
128 
129     int x1 = get<1>(x);
130     double y1 = get<1>(y);
131     int y2 = get<2>(y);
132 
133     x1 = x.get<1>();
134     y1 = y.get<1>();
135     y2 = y.get<2>();
136 }
posted on 2009-02-24 22:07 尹東斐 閱讀(1744) 評論(4)  編輯 收藏 引用

FeedBack:
# re: 實做練習 boost::tuple, 僅供學習。
2009-02-25 16:46 | 路人
效率很低啊,訪問一個節點要付出N次get遞歸函數調用的消耗。  回復  更多評論
  
# re: 實做練習 boost::tuple, 僅供學習。
2009-02-25 20:14 | yindf
@路人

效率是低,但是按照boost::tuple的解釋是,如果編譯器優化好的話,這些函數將都是尾遞歸,相當與循環的說。  回復  更多評論
  
# re: 實做練習 boost::tuple, 僅供學習。
2009-02-25 20:44 | 路人
還不如用“窮舉"的方法,搞成tuple1<typename T1>,tuple2<typename T1,typename T2>.....,直接存取地址效率高很多。  回復  更多評論
  
# re: 實做練習 boost::tuple, 僅供學習。
2009-02-25 23:29 | yindf
@路人

問題是C++目前不支持重載模板參數,要是可以,你的方法很贊。
每個tuple后面加個數字實在不咋好看呀。

而且要是我想知道tuple3第3個元素的類型,怎么辦?  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(4)

隨筆檔案

文章分類

文章檔案

相冊

好友博客

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲美女中文字幕| 麻豆精品传媒视频| 欧美高清在线一区| 亚洲精品免费在线播放| 亚洲国内自拍| 欧美激情第4页| 先锋影音网一区二区| 亚洲欧美日韩国产另类专区| 黄色小说综合网站| 亚洲黄一区二区| 国产精品视频观看| 老司机成人网| 性刺激综合网| 夜夜狂射影院欧美极品| 欧美特黄视频| 亚洲久久成人| 日韩亚洲欧美综合| 国产精品揄拍一区二区| 欧美www视频在线观看| 久热精品在线视频| 性一交一乱一区二区洋洋av| 欧美日韩激情网| 在线中文字幕日韩| 亚洲图中文字幕| 国产精品日韩一区| 久久精品在线播放| 久久夜色精品国产亚洲aⅴ| 国产精品毛片大码女人| 最近看过的日韩成人| 亚洲精品一区二区网址 | 久久高清免费观看| 国产一区二区久久精品| 久久综合久久久久88| 老司机aⅴ在线精品导航| 日韩午夜免费| 亚洲你懂的在线视频| 韩国v欧美v日本v亚洲v| 欧美激情在线观看| 欧美性一区二区| 久久久91精品| 欧美久久久久久久久久| 亚洲女与黑人做爰| 久久人人97超碰国产公开结果| 亚洲精品1234| 亚洲资源av| 亚洲精品孕妇| 午夜精品成人在线| 亚洲精选91| 久久精品二区三区| 亚洲网址在线| 欧美在线影院| 亚洲午夜激情免费视频| 久久免费视频网| 亚洲综合欧美| 免费观看在线综合| 欧美中文在线观看国产| 欧美男人的天堂| 狼狼综合久久久久综合网| 欧美日韩一卡二卡| 欧美国产视频在线观看| 国产毛片一区| 亚洲精品在线观| 亚洲高清久久网| 小辣椒精品导航| 亚洲在线视频一区| 欧美韩国日本一区| 亚洲乱码国产乱码精品精天堂| 国产啪精品视频| 亚洲美女视频网| 亚洲大片精品永久免费| 亚洲欧美日韩在线一区| 日韩亚洲欧美一区二区三区| 欧美亚洲免费在线| 亚洲欧美日韩一区二区| 欧美日韩成人一区二区三区| 欧美成人官网二区| 在线免费高清一区二区三区| 亚洲自拍啪啪| 亚洲欧美www| 国产精品大片| 亚洲精品一区在线观看香蕉| 亚洲激情在线激情| 六月婷婷一区| 母乳一区在线观看| 1000部国产精品成人观看| 欧美伊人久久久久久久久影院 | 欧美日韩一区在线观看视频| 欧美电影免费观看高清| 黄色日韩网站| 久久久www成人免费精品| 欧美一区二区三区在| 国产精品高潮视频| 一本一本a久久| 亚洲在线免费观看| 国产精品久久久久久影视| 夜色激情一区二区| 亚洲欧美视频| 国产三级欧美三级日产三级99| 亚洲午夜精品一区二区| 午夜精品久久久久| 国产欧美日本一区二区三区| 亚洲欧美伊人| 麻豆国产精品va在线观看不卡| 国产一区二区三区奇米久涩 | 欧美高清视频在线| 亚洲国产一区二区三区在线播| 亚洲国产va精品久久久不卡综合| 久久久无码精品亚洲日韩按摩| 免费成人av| 亚洲免费精品| 国产精品久久久久久久久果冻传媒| 一本色道**综合亚洲精品蜜桃冫| 亚洲一区免费视频| 国产偷国产偷精品高清尤物| 久久人91精品久久久久久不卡| 欧美激情一区二区三区在线视频| 一本色道久久| 国产日产亚洲精品| 久久综合狠狠综合久久激情| 亚洲区国产区| 欧美一区二区三区视频免费播放| 国产综合欧美| 欧美精品一线| 销魂美女一区二区三区视频在线| 牛牛国产精品| 亚洲一区亚洲二区| 精品成人一区二区三区四区| 欧美高清在线播放| 欧美日韩成人综合| 欧美在线视频a| 亚洲第一精品影视| 亚洲永久免费视频| 一色屋精品视频免费看| 欧美激情久久久久| 亚洲欧美在线视频观看| 亚洲韩国精品一区| 久久精品在这里| 99视频热这里只有精品免费| 国产精品夜夜夜一区二区三区尤| 久久天天狠狠| 亚洲欧美日韩久久精品| 亚洲国产精品电影在线观看| 亚洲欧美三级伦理| 亚洲国产精品久久91精品| 国产精品久久久久一区二区三区| 久久免费国产| 欧美一级夜夜爽| 亚洲天堂成人在线观看| 亚洲成人在线视频网站| 久久精品国产成人| 亚洲综合二区| 亚洲午夜久久久| 亚洲精品国产精品乱码不99| 国产性猛交xxxx免费看久久| 欧美日韩精品一区二区天天拍小说 | 亚洲欧美影音先锋| 99riav国产精品| 欧美激情一区在线| 免费欧美电影| 久久久亚洲国产天美传媒修理工| 亚洲欧美日韩电影| 宅男噜噜噜66一区二区| 91久久精品国产91久久性色| 国产一区二区三区观看| 国产欧美日本| 国产欧美高清| 国产精一区二区三区| 欧美视频在线观看| 欧美揉bbbbb揉bbbbb| 欧美日韩不卡| 欧美日本精品在线| 欧美日韩国产在线播放| 欧美韩日精品| 欧美人与性动交α欧美精品济南到 | 亚洲欧美一区二区三区在线 | 欧美精品免费在线| 欧美韩日高清| 欧美日韩免费看| 欧美韩日一区二区| 久久久亚洲国产天美传媒修理工 | 久久精品1区| 久久久精品tv| 美国十次成人| 亚洲第一区色| 亚洲精品在线视频观看| 亚洲精品社区| 亚洲图片在线| 久久精品人人爽| 欧美成人精品一区二区三区| 亚洲欧美国产日韩天堂区| 99国产精品久久久| 亚洲欧洲精品成人久久奇米网| 亚洲国产老妈| 日韩一区二区电影网| 一区二区三区精品在线 | 欧美一区二区三区免费观看| 久久成人精品电影| 老色鬼精品视频在线观看播放| 欧美大片在线观看| 欧美视频中文字幕|