boost::iterator_adaptor (I) (轉)

worldblog發表於2007-12-12
boost::iterator_adaptor (I) (轉)[@more@]

發信人: 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::first_type就是int, 而
  second_type就是double. 而奇妙的作用在於cons_type的巢狀使用,
  cons_type, long>::first_type 是
  cons_type, 而first_type::first_type是int. 在這個
  庫中, 額外定義了一個end_of_list表示類表結束.明白了嗎?明白了我
  們就繼續吧 ;)

  然後介紹一個find_param模版, 可以從一個型別列表裡面找出特定的類
  型. 對於不支援偏特化的, 方法如下:
  template
  struct find_param {
  typedef typename find_param_helper1::type 1;
  typedef typename select1::template select::type type;
  };
  其中
  template struct find_param_helper1
  { typedef find_param_continue type; };
  template <> struct find_param_helper1
  { typedef find_param_end type; };
  而
  struct find_param_continue {
  template struct select {
  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  typename find_param::type

  然後介紹一個find_param模版, 可以從一個型別列表裡面找出特定的類
  型. 對於不支援偏特化的編譯器, 方法如下:
  template
  struct find_param {
  typedef typename find_param_helper1::type select1;
  typedef typename select1::template select::type type;
  };
  其中
  template struct find_param_helper1
  { typedef find_param_continue type; };
  template <> struct find_param_helper1
  { typedef find_param_end type; };
  而
  struct find_param_continue {
  template struct select {
  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  typename find_param::type
  >::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 struct find_param;

  template
  struct find_param { typedef default_argument type; };

  template
  struct find_param<:cons_type detail::cons_type="" value="">, Rest>, Key> {
  struct find_param { typedef default_argument type; };

  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::type type;
  }; //否則, 模版巢狀展開.

  TypeList是現在也算是一種常見技巧了, 還是那本Modern C++ Design中提出來的,
建議有興趣的去cuj上找來看更詳細的說明, 主要是建立typelist的方法. ;)

 

-- 
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 


※ 來源:·BBS 水木清華站 bbs.edu.cn·[FROM: 166.111.172.6] 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992189/,如需轉載,請註明出處,否則將追究法律責任。

相關文章