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

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

namespaceboost{
namespaceforeach_detail_{

template<typenameT,typenameC>
inline
typenameboost::iterator_difference<BOOST_DEDUCED_TYPENAMEforeach_iterator<T,C>::type>::type
distance(auto_any_tfirst,auto_any_tlast,type2type<T,C>*)
{
typedefBOOST_DEDUCED_TYPENAMEforeach_iterator<T,C>::typeiter_t;
returnstd::distance(auto_any_cast<iter_t,boost::mpl::false_>(first),
auto_any_cast<iter_t,boost::mpl::false_>(last));
}

}//namespaceforeach_detail_
}//namespaceboost

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

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

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

使用示例:

长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn