Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Объясните, как работает этот foreach для tuple

Помогите разобраться, как работает функция обхода кортежа:
template void tupleForeachImpl(F&& f, T&& t, std::index_sequence) { auto unused = { true, (f(std::get(std::forward(t))), void(), true)... }; }
template void tupleForeach(F&& f, T&& t) { tupleForeachImpl(std::forward(f), std::forward(t), std::make_index_sequence >::value>()); }
Не могу понять, что за магия происходит в 4ой строчке(где unused). Код увидел в коментариях к статье https://habrahabr.ru/post/318236/


Ответ

unused представляет собой фиктивный массив, при инициализации (начиная со второй позиции, чтобы оно работало для tuple<>) элементов которого будет исполняться выражение (f(std::get(std::forward(t))), void(), true).... Это выражение разворачивается для каждого элемента кортежа. Теперь хитрая часть: внутри скобок сначала происходит вызов функции для i-того элемента кортежа c с заменой i последовательно на 0, 1, 2...; затем к результату вызова функции применяется встроенный operator ,; на случай, если функция возвращает тип с перегруженным operator , после запятой идет void(); затем идет еще один встроенный operator , и, наконец, значение для инициализации массива - true

Комментариев нет:

Отправить комментарий