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.