Solution раздел в gnzlbg «с SO вопрос boost::range::join for multiple ranges подразумевает, что может присоединиться ко многим диапазонов в один клиентский код вызова пользовательской функции VARIADIC шаблон, который вызывает boost::join
и boost::make_iterator_range
, В соответствии с этим вопросом, ответом и комментариями, предыдущий может присоединиться к 2 диапазонам, и последний необходим для обеспечения перегрузки прежнего уровня не const
. Любые контейнеры после второго, предположительно, совершенны, переадресованы через std::forward
. Но мой клиентский код может только успешно называть его максимум тремя аргументами. Все, что еще не удается скомпилировать. Что случилось и как это исправить? И есть ли теперь объект Boost, который объединяет многие диапазоны?подталкивание :: Диапазон :: присоединиться много диапазонов в одном пользовательском вызове
Я скопировал и вставил, что реализация OP, в редактировании его здесь только для пробельных читаемости и добавив соответствующие заголовки:
#include <utility>
#include <boost/range/join.hpp>
template<class C>
auto join(C&& c)
-> decltype(boost::make_iterator_range(std::begin(c), std::end(c)))
{
return boost::make_iterator_range(std::begin(c), std::end(c));
}
template<class C, class D, class... Args>
auto join(C&& c, D&& d, Args&&... args)
-> decltype
(
boost::join
(
boost::join
(
boost::make_iterator_range(std::begin(c), std::end(c)),
boost::make_iterator_range(std::begin(d), std::end(d))
),
join(std::forward<Args>(args)...)
)
)
{
return boost::join
(
boost::join
(
boost::make_iterator_range(std::begin(c), std::end(c)),
boost::make_iterator_range(std::begin(d), std::end(d))
),
join(std::forward<Args>(args)...)
);
}
и добавил свой код клиента:
#include <deque>
#include <array>
#include <vector>
#include <iostream>
int main()
{
std::deque<int> deq { 0, 1, 2, 3, 4 };
std::array<int, 4> stl_arr { 5, 6, 7, 8 };
int c_arr[3] { 9, 10, 11 };
std::vector<int> vec { 12, 13 };
for (auto& i : join(deq, stl_arr, c_arr))
{
++i;
std::cout << i << ", "; // OK, prints 1 thru 12
}
//join(deq, stl_arr, c_arr, vec); // COMPILER ERROR
}