Распаковка значений из tuple как параметры функции

Есть следующий код:

#include <iostream>
#include <tuple>

template<typename... Ts>
int F(Ts&&... args)
{
    std::cout << '[';
    std::size_t n{ 0 };
    ((std::cout << args << (++n != sizeof...(Ts) ? ", " : "")), ...);
    std::cout << "]\n";
    return sizeof...(args);
}

int main()
{
    // 1
    auto count1 = F(2, "tt", 7.56, true);
    std::cout << "count = " << count1 << "\n";

    // 2
    std::tuple ttt = (2, "tt", 7.56, true);
    auto count2 = std::apply(
        [](auto &&... args) { return F(args...); },
        ttt
    );
    std::cout << "count2 = " << count2 << "\n";

    return 0;
}

При вызове функции напрямую с параметрами все в порядке. Вывод:

[2, tt, 7.56, 1] 
count = 4

Пытаюсь разобраться, как можно вызвать эту функцию, распаковав значения из tuple. Но в втором случае вывод:

[1]
count2 = 1

Что я делаю не так?


Ответы (1 шт):

Автор решения: user7860670

В записи std::tuple ttt = (2, "tt", 7.56, true); в качестве инициализитора выступает выражение, в котором в скобках три раза вызывается ничего не делающий встроенный оператор запятой и в результате выдается true и создается tuple<bool>.

При инициализации не должно быть ни символа равно, ни круглых скобок. Используйте синтаксис direct list initialization:

std::tuple ttt{2, "tt", 7.56, true};
→ Ссылка