c – 在boost元组,zip_iterator等上使用std :: get和std :: tie

使用std :: get<>()和std :: tie<>()以及boost构造有什么选择?

例:
我想使用基于范围的for循环来迭代几个容器.我可以实现zip函数,它使用boost :: zip_iterator.

#include <boost/iterator/zip_iterator.hpp>
 #include <boost/range.hpp>

 template <typename... TContainer>
 auto zip(TContainer&... containers) -> boost::iterator_range<boost::zip_iterator<decltype(boost::make_tuple(std::begin(containers)...))>> {
    auto zip_begin = boost::make_zip_iterator(boost::make_tuple(std::begin(containers)...));
    auto zip_end = boost::make_zip_iterator(boost::make_tuple(std::end(containers)...));
    return boost::make_iterator_range(zip_begin,zip_end);
 }

现在我可以像这样使用它:

std:list<int> a;
std::vector<double> b;
...
for (auto t : zip(a,b)) {
   // access elements by boost::get<0>(t),boost::get<1>(t)
   // or use boost::tie(a_element,b_element)
}

当我调用其他方法时出现问题,这需要std :: tuple或std :: pair – 我必须转换),因为其余代码使用std :: tuples,或者模板化代码使用std :: get<> ()和/或std :: tie().

我找到了一些为zip_iterator添加std :: tuple支持的补丁,但这些补丁不适用于我的版本(我使用的是Boost 1.54).

我错过了什么吗?我有什么选择强制zip_iterator返回std :: tuple或make std :: get,std :: tie等可用于boost类型?

解决方法

你有没有尝试过
#include <boost/iterator/zip_iterator.hpp>
#include <boost/range.hpp>
#include <tuple>

template <typename... TContainer> auto zip(TContainer&... containers) ->
boost::iterator_range<boost::zip_iterator<decltype(std::make_tuple(std::begin(containers)...))>> {
                                                   ^^^
    auto zip_begin = boost::make_zip_iterator(std::make_tuple(std::begin(containers)...));
                                              ^^^
    auto zip_end = boost::make_zip_iterator(std::make_tuple(std::end(containers)...));
                                            ^^^
    return boost::make_iterator_range(zip_begin,zip_end);
 }

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...