Помогите разобраться, как работает функция обхода кортежа:
template <typename F, typename T, size_t... i>
void tupleForeachImpl(F&& f, T&& t, std::index_sequence<i...>)
{
auto unused = { true, (f(std::get<i>(std::forward<T>(t))), void(), true)... };
}
template <typename F, typename T>
void tupleForeach(F&& f, T&& t)
{
tupleForeachImpl(std::forward<F>(f), std::forward<T>(t),
std::make_index_sequence<std::tuple_size<std::remove_reference_t<T> >::value>());
}
Не могу понять, что за магия происходит в 4ой строчке(где unused). Код увидел в коментариях к статье https://habrahabr.ru/post/318236/
unused представляет собой фиктивный массив, при инициализации (начиная со второй позиции, чтобы оно работало для tuple<>) элементов которого будет исполняться выражение (f(std::get<i>(std::forward<T>(t))), void(), true).... Это выражение разворачивается для каждого элемента кортежа. Теперь хитрая часть: внутри скобок сначала происходит вызов функции для i-того элемента кортежа c с заменой i последовательно на 0, 1, 2...; затем к результату вызова функции применяется встроенный operator ,; на случай, если функция возвращает тип с перегруженным operator , после запятой идет void(); затем идет еще один встроенный operator , и, наконец, значение для инициализации массива - true.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей