Boost :: Combine, на основе диапазона и структурированные - PullRequest
3 голосов
/ 09 апреля 2019

Есть ли способ заставить boost::combine работать со структурированными привязками и на основе диапазона для (чтобы идентификаторы в структурной привязке фактически указывали на элементы контейнеров вместо вложенных кортежей того, что boost::combine использует под капотом)? Следующее ( живой пример ) не скомпилируется:

#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 ]

2 голосов
/ 09 апреля 2019

Реальный ответ - использовать либо boost::tie, либо взять диапазон-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>>
    { };
}

Но на самом деле не делайте этого в реальном коде, поскольку на самом деле только автор текста должен подписаться на подобные вещи.

Это заставит структурированную привязку просто работать.

0 голосов
/ 09 апреля 2019

Для этого можно использовать 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;   
    }
}

Демо .

...