Почему алгоритмы STL не перегружены для std :: tuple? - PullRequest
0 голосов
/ 23 мая 2018

Мне было интересно, почему нет некоторых перегрузок для некоторых алгоритмов STL, чтобы их можно было использовать с кортежами.Под некоторыми я подразумеваю те, которые не переупорядочивают элементы.Хорошим примером может быть std::for_each.

Существует ли ограничение по языку, например, тот факт, что невозможно совместить оценку во время компиляции и оценку во время выполнения?Позвольте мне прояснить это последнее предложение:

Я знаю, что сама итерация должна была бы стать итерацией во время компиляции, затем должны быть определены итераторы времени компиляции, чтобы использовать время компиляции std::get<> для выборкиценности.После этого должна быть возможность применять шаблонную лямбду к каждому разнородному типу в кортеже, но затем оценивается значение этого типа во время выполнения.

Я думаю, что это будет возможно, даже если я лично не будузнаю, с чего начать.Я видел реализации, которые совсем не похожи на std::for_each для достижения того же результата.Почему так?

(ПРИМЕЧАНИЕ: под кортежем я имею в виду std::pair и std::tuple)

Ответы [ 2 ]

0 голосов
/ 23 мая 2018
Алгоритм

STL использует итераторы, которые несовместимы с std::tuple.

std::tuple поставляется со своим собственным набором функций, поэтому ваш for_each может быть выполнен с std::apply:

std::apply([](const auto&... args)
          {
              ((std::cout << args << std::endl), ...); // C++17 Fold expression
          }, t);
0 голосов
/ 23 мая 2018

Прежде всего, кортежи не являются контейнерами как таковыми.Конечно, вы можете использовать их для хранения данных, но они полностью (или, по крайней мере, могут быть ) полностью неоднородны.Это оставляет нас с вопросом, почему вы хотите перебирать разнородные данные?Я думаю, что в большинстве ситуаций нет причин.В основном, когда вы выполняете итерации по чему-либо, вы хотите использовать сходства в итерированном типе, чтобы упростить вашу работу со знакомыми объектами.

Конечно, существуют угловые случаи с шаблонами и так далее, и так далее, когда вы хотите выполнить итерациюнад кортежемНо я думаю, что они достаточно редки, чтобы избавить стандартный ад от большого количества кода и магии шаблонов, чтобы достичь того, чего мы хотели.В любом случае, такая итерация уже реализована в boost fusion .Возможно, когда-нибудь она станет частью стандарта, как и многие другие библиотеки повышения.

...