170 похожих чатов

Всем привет! Есть вот такая пара функций, она применяет какую-то другую

произвольную функцию к объектам кортежа

template <class Tuple, class F, std::size_t... I>
constexpr F for_each_impl(Tuple&& t, F&& f, std::index_sequence<I...>) {
return (void)std::initializer_list<int>{(std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))),0)...}, f;
}

template <class Tuple, class F>
constexpr F for_each_(Tuple&& t, F&& f) {
return for_each_impl(std::forward<Tuple>(t), std::forward<F>(f),
std::make_index_sequence<std::tuple_size<std::remove_reference_t<Tuple>>::value>{});
}

Собственно, вопрос - как прочитать строку возврата?
return (void)std::initializer_list<int>{(std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))),0)...}, f;
я чего-то въехать не могу, кастуем список инициализации к void и через запятую указатель на функцию просто упоминаем?

7 ответов

12 просмотров

Применяется раскрытие пака на выражение (std::get<I>(std::forward<Tuple>(t))), 0) Оператор запятая возвращает последний операнд, при этом вычисляя все подвыражения

Это из > C++17-времен, видимо, когда fold-expr не было, а упорядоченно вычислить хотелось. Раскрытие пака в инициализатор позволяет вычислить условный f(t[i], 0) в порядке аргументов инициализатора (и порядке индексов последовательности по совместительству). Сама функция возвращается по интерфейсному контракту (оператор "запятая" вычисляет подвыражения слева-направо, возвращая последнее).

Применяется раскрытие пака на выражение (std::forward<F>(f)(std::get<I>(std::forward<Tuple>(t))),0) А на именно на это выражение (std::get<I>(std::forward<Tuple>(t))), 0) Оператор запятая возвращает последний операнд, при этом вычисляя все подвыражения. Т.е. выглядит в конечном счете, опустив форварды и прочее, это примерно так: (F(tuple_elements), 0)... В итоге получается, что собирается initializer list из нулей, при этом вычисляется выражение F(tuple_elements)...

f0xeri
А зачем все так сложно то…

Чуть выше, тов. Sergey написал, зачем)

Andrey-Solovyev Автор вопроса
f0xeri
А зачем все так сложно то…

Да я пытаюсь развернуть parameter pack, вот собираюсь реверснуть кортеж, который из пака делаю. Других идей нет.

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
11
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
это группа токсиков или тех кто помогает?
Ибрагим
9
Я короче решил скомпилировать Nim в js, я думал он сработает как обычный транслятор. По итогу он мне создал файл с расширением js, и туда поместил кучу кода Вопрос, что это з...
𝕾𝖍𝖆𝖉𝖊 <suspense>
8
мы пытаемся подменить функцию, которая имеет меньше инструкций относительно функции, которой подменяем. https://www.reddit.com/r/jailbreakdevelopers/comments/w06ujy/mshookfun...
Óðinn
6
У кого-нибудь есть под рукой функция кодирования юникода, которая из фразы На русском сделает \u041d\u0430\u0020\u0440\u0443\u0441\u0441\u043a\u043e\u043c ?
Daniil Smolyakov
7
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Карта сайта