boost :: combine,基于范围的for和结构化绑定

时间:2019-04-09 05:34:57

标签: c++ for-loop boost c++17

是否有一种方法可以使boost::combine与结构化绑定一起使用并基于范围进行操作(以便结构绑定中的标识符实际上指向容器的元素,而不是嵌套boost::combine在下面使用的元组)引擎盖)?以下(live example)无法编译:

#include <boost/range/combine.hpp>
#include <iostream>

int main()
{
    std::vector<int> a{1,2,3};
    std::vector<int> b{2,3,4};

    for (auto [f, s] : boost::combine(a, b))
    {
        std::cout << f << ' ' << s << std::endl   
    }
}

2 个答案:

答案 0 :(得分:1)

您可以使用boost::tie完成此操作。

#include <boost/range/combine.hpp>
#include <iostream>

int main()
{
    std::vector<int> a{1,2,3};
    std::vector<int> b{2,3,4};
    int f, s;
    for (auto var : boost::combine(a, b))        
    {
        boost::tie(f, s) = var;
        std::cout << f << ' ' << s << std::endl;   
    }
}

Demo

答案 1 :(得分:1)

真正的答案是使用boost::tie或获取范围v3 zip(),而实际上产生std::tuple


出于教育目的,唯一的答案就是使结构化绑定机制适合boost::tuples::cons。该类型已经有一个get()可以与ADL一起使用并且可以正确执行操作,因此我们所需要做的就是提供tuple_sizetuple_element(由于这些方法实际上很容易实现Boost中已经存在确切的特征):

namespace std {
    template <typename T, typename U>
    struct tuple_size<boost::tuples::cons<T, U>>
        : boost::tuples::length<boost::tuples::cons<T, U>>
    { };

    template <size_t I, typename T, typename U>
    struct tuple_element<I, boost::tuples::cons<T, U>>
        : boost::tuples::element<I, boost::tuples::cons<T, U>>
    { };
}

但是实际上不要在真正的代码中执行此操作,因为实际上只有类型作者才应该选择参加这种事情。

这将使结构化绑定正常工作。