boost::iterator_adaptor (I) (轉)
發信人: huxw (米老鴨和唐老鼠), 信區: Programming
標 題: boost::iterator_adaptor (I)
發信站: BBS 水木清華站 (Sat May 18 23:27:33 2002)
內容很多, 一部分一部分來. 先說其中的typelist實現的原理。
I) Type-list, 型別列表. 很tricky的方法, 第一次看見是在loki庫裡
面. 有時候我們確實需要一個型別的列表, 可以簡單的遍歷訪問. 而一般的
容器是不能儲存型別的. 怎麼辦? 看下面.
首先, 這裡的型別列表是怎麼建立起來的? 很簡單
template
struct cons_type {
typedef A first_type;
typedef B second_type;
};
這樣的情況下, cons_type
second_type就是double. 而奇妙的作用在於cons_type的巢狀使用,
cons_type
cons_type
庫中, 額外定義了一個end_of_list表示類表結束.明白了嗎?明白了我
們就繼續吧 ;)
然後介紹一個find_param模版, 可以從一個型別列表裡面找出特定的類
型. 對於不支援偏特化的, 方法如下:
template
struct find_param {
typedef typename find_param_helper1
typedef typename select1::template select
};
其中
template
{ typedef find_param_continue type; };
template <> struct find_param_helper1
{ typedef find_param_end type; };
而
struct find_param_continue {
template
typedef typename AssocList::first_type Head;
typedef typename Head::first_type Key1;
typedef typename Head::second_type Value;
typedef typename if_true::value)>::template
then
然後介紹一個find_param模版, 可以從一個型別列表裡面找出特定的類
型. 對於不支援偏特化的編譯器, 方法如下:
template
struct find_param {
typedef typename find_param_helper1
typedef typename select1::template select
};
其中
template
{ typedef find_param_continue type; };
template <> struct find_param_helper1
{ typedef find_param_end type; };
而
struct find_param_continue {
template
typedef typename AssocList::first_type Head;
typedef typename Head::first_type Key1;
typedef typename Head::second_type Value;
typedef typename if_true::value)>::template
then
>::type type;
};
};
struct find_param_end {
template
struct select { typedef detail::default_argument type; };
};
從以上程式碼綜合看來, 當Key1和Key2是同一型別的時候, 就是模版巢狀
結束的時候, 否則, 模版不停巢狀展開, 知道找到合適的Key2(is_same)或者遇到
end_of_list(特化的模板)為止. if_true的模版在detail/select_type.hpp中,
很明瞭.
花開兩朵, 如果是支援片特化的編譯器, 那就簡單的多了.
template
template
struct find_param
template
struct find_param<:cons_type detail::cons_type="" value="">, Rest>, Key> {
struct find_param
template
struct find_param<:cons_type detail::cons_type="" value="">, Rest>, Key> {
typedef Value type;
}; //偏特化, 表示Key和Key相同的情況
template
struct find_param<:cons_type detail::cons_type="" value="">, Rest>, Key2> {
typedef typename find_param
}; //否則, 模版巢狀展開.
TypeList是現在也算是一種常見技巧了, 還是那本Modern C++ Design中提出來的,
建議有興趣的去cuj上找來看更詳細的說明, 主要是建立typelist的方法. ;)
--
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
※ 來源:·BBS 水木清華站 bbs.edu.cn·[FROM: 166.111.172.6]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992189/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- boost::iterator_adaptor (II) (轉)APT
- boost::iterator_adaptor (III) (轉)APT
- boost::any原始碼分析 (轉)原始碼
- boost原始碼剖析----boost::any原始碼
- boost學習之Boost.Lambda
- boost and windowsWindows
- 對Boost庫中的數值到字串的轉換的改進 (轉)字串
- Boost UDP Transaction PerformanceUDPORM
- boost之ThreadPoolthread
- 小試 boost spirit
- Boost原始碼剖析--原始碼
- Tracking Boost Regulator TYPICAL 5V REGULATION WITH BOOST CONVERTER AND LDO
- C++ Boost 之Python(一個簡單的例子) (轉)C++Python
- [Boost]一種簡單的批分字串的辦法 (轉)字串
- 編譯 boost 庫(win7+boost1.60+vs2008)編譯Win7
- Flutter Boost3.0初探Flutter
- Boost常用庫案列
- boost庫的介紹
- 使用boost庫處理 int 、float、string之間相互轉換
- 安裝caffe時候找不到boost怎麼辦?(boost的引用問題make can‘t find Boost‘s include files)
- BadBoy I 源程式! (轉)
- boost.asio包裝類st_asio_wrapper開發教程(轉)APP
- 實戰準標準庫Boost —— (2)測試Boost配置的Hello World程式
- 在Qt中使用boost庫QT
- Boost timer實現
- boost http響應讀取HTTP
- boost庫學習筆記筆記
- Boost中的單利模式模式
- Boost原始碼剖析開篇原始碼
- buck電路 & boost電路
- 在XSL裡執行類似for(i=0;i〈x;i++)的迴圈 (轉)
- Oracle9i 分割槽(轉)Oracle
- 解析Oracle 8i/9i的計劃穩定性(轉)Oracle
- 最新Turbo Boost Switcher Pro補丁破解版 Turbo Boost Switcher Pro破解安裝教程
- boost------asio庫的使用1(Boost程式庫完全開發指南)讀書筆記筆記
- flutter_boost匯入問題Flutter
- Flutter Boost 混合開發框架初探Flutter框架
- We Boost the Adoption of New Technology