Пока мы ждем поддержки std::ranges::views::concat от всех компиляторов, как проще всего это реализовать?
Я хочу иметь что-то вроде код ниже с некоторыми оговорками:
- Мне бы хотелось, чтобы лямбда-выражение располагалось в конце списка аргументов, как в большинстве алгоритмов std.
- Я бы меня больше устраивает синтаксис for_each_range({r1,r2,r3},lambda), но я не могу понять, как заставить эти { } работать здесь. Std::initializer_list, похоже, не мой путь, поскольку для него требуются константные данные, и мне приходится менять значения в диапазонах.
Код: Выделить всё
#include
#include
#include
template
void for_each_range(Func func, R&& range)
{
for (auto& container : range) {
func(container);
}
}
template
void for_each_range(Func func, R&& range, Args&&... ranges)
{
for (auto& container : range) {
func(container);
}
for_each_range(func, ranges...);
}
int main()
{
std::vector weights = { 1.0f, 2.0f, 3.0f };
std::vector masks = { 1.0f, 0.0f, 1.0f };
for_each_range([](auto& v) { v = 7.0f; }, weights, masks);
std::ranges::copy
(
weights,
std::ostream_iterator{std::cout, ", "}
);
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79314235/how-to-process-many-ranges-with-the-same-nameless-lambda[/url]