【发布时间】:2014-05-04 18:06:12
【问题描述】:
将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<>() 和/或 @ 987654333@.
我发现一些补丁添加了std::tuple 对zip_iterator 的支持,但这些未应用于我的版本(我使用 Boost 1.54)。
我错过了什么吗?我有哪些选项可以强制zip_iterator 返回std::tuple 或使std::get、std::tie 等可用于提升类型?
【问题讨论】:
-
不幸的是,这些补丁仍然没有被应用,即使是在 1.55 版本中。这是票的链接:svn.boost.org/trac/boost/ticket/7526。似乎没有任何活动,我不知道为什么。
-
@void-pointer 已在 2017 年 3 月提交并合并了带有 boost::fusion 的修复:github.com/boostorg/iterator/pull/2,并在 Boost 1.64.0 中可用。
标签: c++ c++11 boost stl tuples