将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
,或模板化代码使用{ {1}}和/或std::get<>()
。
我找到了一些补丁,为std::tie()
添加std::tuple
支持,但这些补丁不适用于我的版本(我使用的是Boost 1.54)。
我错过了什么吗?我有哪些选项可以强制zip_iterator
返回zip_iterator
或使std::tuple
,std::get
等可用于提升类型?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
在boost&gt; = 1.55中使用boost::combine
。
for (auto a_tuple: boost::combine(va, vb))
{...}
或
BOOST_FOREACH(boost::tie(elem_a, elem_b), boost::combine(va, vb))
{...}