Присоединиться к переменному количеству диапазонов - PullRequest
0 голосов
/ 14 января 2019

Мне нужно объединить несколько экземпляров boost::iterator_range. Моя первоначальная идея состояла в том, чтобы использовать boost::join, но похоже, что в качестве параметров он принимает только два диапазона. На другой вопрос я обнаружил, что наиболее проголосовавшим ответом было «ну, просто позвоните снова», но в моем случае это не работает. Я понял, что причина может заключаться в том, что я не знаю во время компиляции точное число диапазонов, к которым я собираюсь присоединиться, в результате чего boost::join не знает его тип возвращаемого значения. Чтобы сделать его более понятным, мне нужно использовать его в цикле for, например:

SomeRangeType result;

for ( const auto& a_range : some_list_of_ranges )
{
    result = boost::join( result, a_range );
}

return result;

Существует ли в boost? 1008 * другая операция соединения, подобная той, которая мне нужна?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

range-v3 имеет concat и join просмотров, кажется, вы хотите присоединиться к представлению здесь:

std::vector<std::vector<int>> v{{1, 2, 3}, {4}, {5, 6}};

for (auto e : v | ranges::view::join) {
    std::cout << e << " "; // 1 2 3 4 5 6
}

Демо

0 голосов
/ 14 января 2019

C ++ не имеет динамических шаблонов времени выполнения, поэтому идея не работает с boost::range.

У нас может быть 2 диапазона r1 и r2 с типами R1 и R2, а когда мы join, мы получаем результат (назовем его r12) типа boost::joined_range<R1,R2>.

У нас может быть третий диапазон (скажем, r3 типа R3), и join с его помощью r12 мы получим результат типа boost::joined_range<boost::joined_range<R1,R2>,R3>.

Диапазоны r1, r2, r3 и т. Д. Могут быть переданы в функцию шаблонов переменных в качестве аргументов, и из списка аргументов мы можем составить компилятор, чтобы выяснить, каков будет результирующий тип. То же самое, когда у нас есть диапазоны в коллекции фиксированной длины (например, std::tuple или std::array), мы можем сделать компилятор, чтобы выяснить, каков в итоге тип соединения.

Однако, если у нас нет фиксированного количества диапазонов, а динамического количества во время выполнения (например, из std::vector), тогда мы не знаем, какой будет тип соединения, и компилятор не может понять это. время компиляции. Однако каждый тип должен быть известен во время компиляции в C ++.

Таким образом, вы должны либо найти способ фиксировать количество диапазонов, к которым вы присоединяетесь, во время компиляции, либо использовать этот динамический, не объединенный набор (например, vector) диапазонов в качестве типа данных, либо вы должны использовать некоторые третья вещь, как Range-V3.

...