如何在使用boost构造时,同时使用std::get<>()
和std::tie<>()
?
例如:我想使用基于范围的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
,或使std::get
、std::tie
等在boost类型中可用?