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

182
01 апреля 2018, 20:42

Помогите разобраться, как работает функция обхода кортежа:

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/

Answer 1

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

READ ALSO
Is not valid win32 application

Is not valid win32 application

В общем когда запуская приложение высвечивается ошибка "is not valid win32 application"На просторах интернета ответов не нашёл по этому обращаюсь сюда

169
Сортировка элементов структуры типа string c++

Сортировка элементов структуры типа string c++

Не знаю какой должная быть ф-ия, которая принимает массив структур и сортирует его по одному элементу типа string, да ещё и по алфавитуМожет кто...

172
Удаление элемента из двоичного файла с++

Удаление элемента из двоичного файла с++

Имеется однонаправлянный связаный список, который находиться в двоичном файлеФайл мы создает из консоли, и там же его заполняем

172
Найти угол между тремя точками

Найти угол между тремя точками

Необходимо определить угол точки C относительно двух точек А и В, точки A и B образуют "отрезок", который можно ассоциировать с осью X, так как...

213