boost::iterator_adaptor (II) (轉)
發信人: huxw (米老鴨和唐老鼠), 信區: Programming
標 題: boost::iterator_adaptor (II)
發信站: BBS 水木清華站 (Sun May 19 22:27:09 2002)
申明:這裡只是一種技巧。從某種眼光看來過於花哨。所以我只是介紹
介紹,並不是要鼓勵大家都這樣去折磨你的。 ;)
II) 簡化複雜的模板引數列表
iterator模版中用到很多模版引數, value, pointer, reference等等,
他們之間並非沒有聯絡. 事實上, 這些模版引數的預設值本來都是推算
出來的.
template
class Reference = typename iterator_defaults
class Pointer = typename iterator_defaults
class Category = typename std::iterator_traits
class Distance = typename std::iterator_traits
>
很合理是吧, 但是有沒有想過如果我們並不需要提供那麼多模版引數的
時候總需要輸入那麼多, 會怎麼樣? 有沒有想過如果這樣的推算推不出
結果來怎麼辦? 所以最後我們看到的程式碼是醬紫的.
template
class Reference = ::boost::detail::default_argument,
class Pointer = ::boost::detail::default_argument,
class Category = ::boost::detail::default_argument,
class Distance = ::boost::detail::default_argument
> struct iterator_adaptor
這樣的程式碼能帶來什麼好處呢? 就是我們可以醬紫例項化模版了.
iterator_adaptor
iterator_category_is<:input_iterator_tag>,
value_type_is
> myite;
注意到了嘛, 模版引數根本不和我們宣告的時候相同. ;) 多奇妙啊,
我們用預設引數的時候都不能這樣.
宣告: int foo(int i, long j = 0, double k = 9.8);
而的時候:foo(1, k = 8.7); // 錯誤
但是模版例項化的時候可以. 原因就在於iterator_adaptor開始時做的
手腳. 他用了一個iterator_traits_gen的模板. 這個模版並不在乎我
們給的模版引數的意義, 他只是簡單的構建一個typelist, 然後利用
find_param從typelist中把需要的型別撿出來.
typedef detail::cons_type< typename make_arg
detail::cons_type
detail::cons_type
detail::cons_type
detail::cons_type
end_of_list> > > > > ArgList;
typedef typename find_param
typedef typename find_param
typedef typename find_param
typedef typename find_param
typedef typename find_param
結合上面的程式碼中出現的value_type_is類似的方法, 你一定直覺到make_arg
有問題. 確實,
template
enum { value = false; }
};
template
template
struct make_arg {
enum { is_named = is_named_parameter
//我們使is_named_parameter對value_type_is型別做特化, 那麼.... 呵呵
typedef typename if_true::template
then
typedef typename Make::template
};
struct make_named_arg {
template
struct select { typedef typename Value::type type; };
}; //如果用value_type_is
struct make_key_value {
struct make_named_arg {
template
struct select { typedef typename Value::type type; };
}; //如果用value_type_is
struct make_key_value {
template
struct select { typedef detail::cons_type
}; //如果用T做模版引數
是不是有了一點心得了? 那麼長的篇幅, 看到這裡真不容易. 既然都看
到這裡了, 就幫個忙, 給peach寫一封信騷擾, 請他寫寫
boost::function吧. ;)
--
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
※ 修改:·huxw 於 May 19 22:28:23 修改本文·[FROM: 166.111.172.6]
※ 來源:·BBS 水木清華站 bbs.edu.cn·[FROM: 166.111.172.6]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992677/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- boost::iterator_adaptor (I) (轉)APT
- boost::iterator_adaptor (III) (轉)APT
- boost::any原始碼分析 (轉)原始碼
- boost原始碼剖析----boost::any原始碼
- boost學習之Boost.Lambda
- BadBoy II 源程式 (轉)
- Delphi物件模型(Part II) (轉)物件模型
- boost and windowsWindows
- (轉)資料庫Flash Cache(II)資料庫
- Leedcode-反轉字串 II字串
- boost library
- 對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]一種簡單的批分字串的辦法 (轉)字串
- On Designing Good Libraries -- Part II (轉)Go
- 編譯 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)
- [leetcode 92] 反轉連結串列 IILeetCode
- boost.asio包裝類st_asio_wrapper開發教程(轉)APP
- 實戰準標準庫Boost —— (2)測試Boost配置的Hello World程式
- 在Qt中使用boost庫QT
- Boost timer實現
- boost http響應讀取HTTP
- boost庫學習筆記筆記
- Boost中的單利模式模式
- Boost原始碼剖析開篇原始碼
- buck電路 & boost電路
- Range Addition II 範圍求和 II
- Hackable: II