Помогите разобраться, как работает функция обхода кортежа:
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
Комментариев нет:
Отправить комментарий