Распаковка значений из 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};