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

Joh*_*hny 7 c++ boost stl tuples c++11

我有什么选择使用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);
 }
Run Code Online (Sandbox Code Playgroud)

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

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)
}
Run Code Online (Sandbox Code Playgroud)

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

我找到了一些增加std::tuple支持的补丁zip_iterator,但这些补丁并没有在我的版本中应用(我使用的是Boost 1.54).

我错过了什么吗?我的选择是要么力zip_iterator返回std::tuple或使std::get,std::tie等可用于升压类型?

Dan*_*vil 0

你有没有尝试过

#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);
 }
Run Code Online (Sandbox Code Playgroud)