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

有没有一种方法可以使boost :: combine与结构化绑定和基于范围的for一起工作(以便结构绑定中的标识符实际上指向容器的元素,而不是在底层使用的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   
    }
}

解决方法:

真正的答案是使用boost :: tie或获取range-v3 zip(),它实际上产生一个std :: tuple.

仅出于教育目的的答案只是使结构化绑定机制适应boost :: tuples :: cons.该类型已经有一个get(),它可以与ADL一起使用并做正确的事情,因此我们所需要做的就是提供tuple_size和tuple_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>>
    { };
}

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

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

上一篇:c-VS 2017程序无法识别“ scoped_lock”


下一篇:[python]pep8编码规范