在boost.foreach中操作迭代器

boost.foreach库使用起来非常方便,但实现的技巧可算是精彩绝伦。写基础库就应该如此,困难的永远留给自己,将光鲜的一面奉献出来。
 简单使用示例:    
  std::vector< int> vecs;
  vecs.push_back( 1);
  vecs.push_back( 2);
  vecs.push_back( 3);
  vecs.push_back( 4);
  vecs.push_back( 5);

  BOOST_FOREACH( int index, vecs) {
    _asm nop;
  }
 顺序遍历十分方便,但有时候想获取更多的信息(如:当前遍历的位置索引等),就不得不需要获取到当前的迭代器位置。
 观察foreach的内部实现,_foreach_cur变量存放当前迭代器的信息,但也仅仅如此,无法直观地获取具体的迭代器类型。
 要使用_foreach_cur变量,必须书写相应的辅助函数.

下面以获取foreach的两个迭代器之间的距离为例: 

namespace boost {
namespace foreach_detail_ {
  
template<typename T, typename C>
inline 
typename boost::iterator_difference<BOOST_DEDUCED_TYPENAME foreach_iterator<T, C>::type>::type
    distance(auto_any_t first, auto_any_t last, type2type<T, C> *)
{
  typedef BOOST_DEDUCED_TYPENAME foreach_iterator<T, C>::type iter_t;
   return std::distance(auto_any_cast<iter_t, boost::mpl::false_>(first),
    auto_any_cast<iter_t, boost::mpl::false_>(last));
}

//  namespace foreach_detail_
//  namespace boost

 获取当前的迭代位置到容器开始的距离:

#define BOOST_FOREACH_DISTANCE(COL)   \
  boost::foreach_detail_::distance(BOOST_FOREACH_BEGIN(COL), _foreach_cur, BOOST_FOREACH_TYPEOF(COL))

宏参数COL为容器变量或者返回值为容器的函数,根据foreach的实现技巧,该参数并不会被求值,仅仅用其做模板参数的推导。

使用示例:

  BOOST_FOREACH( int index, vecs) {
    assert(index == BOOST_FOREACH_DEREF(vecs));
    size_t dis = BOOST_FOREACH_DISTANCE(vecs);
    _asm nop;
  }

转载于:https://www.cnblogs.com/fangkm/archive/2012/11/27/2790269.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值