C ++ 20 range-v3 и адаптер представления zip_with - PullRequest
0 голосов
/ 28 марта 2019

С помощью комбинатора ленивых диапазонов, такого как ranges::view::reverse, я могу предоставить ему один аргумент (например, reverse(iota(0,3)));или я могу использовать его для настройки диапазона, используя operator| (например, iota(0,3) | reverse).Это соотношение кажется довольно регулярным;ниже приведены примеры нулевого, унарного и двоичного представлений:

#include <range/v3/all.hpp>
#include <iostream>

int main(int argc, char *argv[])
{
  using namespace ranges::view;
  std::cout <<        (iota(0,9) | reverse)      << ' ';
  std::cout << reverse(iota(0,9))                << '\n';

  std::cout <<        (iota(0,9) | chunk(4))     << ' ';
  std::cout <<   chunk(iota(0,9),4)              << '\n';

  std::cout <<        (iota(0,9) | replace(5,0)) << ' ';
  std::cout << replace(iota(0,9),5,0)            << '\n';
  return 0;
}

Я заметил, что комбинатор ranges::view::zip_with можно использовать только во второй (неадаптивной) форме;такие как zip_with(std::plus{},iota(0,9),iota(0,9)).Есть ли техническая причина, по которой zip_with нельзя определить для работы с operator|?Есть ли канонический порядок аргументов комбинаторов ленивых диапазонов в библиотеке range-v3?

Я работаю с последней версией (v0.4.0) библиотеки range-v3.

1 Ответ

2 голосов
/ 28 марта 2019

Это довольно распространенное соглашение в range-v3, что r | adapter(x) означает то же самое, что и adapter(r, x). (Действительно, есть даже язык программирования, Elixir, для которого r |> adapter(x) фактически оценивается как adapter(r, x) напрямую).

Проблема с zip_with заключается в том, что использование, как вы указываете, это:

zip_with(std::plus{},iota(0,9),iota(0,9))

Что означает, что логическое разделение с operator| будет:

std::plus{} | zip_with(iota(0,9),iota(0,9))

Но тогда это не диапазон с левой стороны. Это какой-то бинарный оператор. range-v3 это все о цепочках диапазонов . В любом другом случае это диапазон, который отображается слева от |. Так что, хотя это технически не сложно сделать, это кажется совершенно другой вещью.

...