Реальный ответ - использовать либо 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>>
{ };
}
Но на самом деле не делайте этого в реальном коде, поскольку на самом деле только автор текста должен подписаться на подобные вещи.
Это заставит структурированную привязку просто работать.