Как создать функцию, которая принимает другую функцию с кортежем аргументов

#c #tuples

Вопрос:

Мне нужна функция My_func, которая работает следующим образом

 auto f = [](const std::tuple<string, double>amp; t) { return std::get<0>(t); };
    assert(My_func(f)("Hello", 8.5) == f({"Hello", 8.5}));
 

Теперь у меня есть

 template <class F>
constexpr auto My_func(Famp;amp; f) {
    return [f](autoamp;amp; args...) { return std::forward<F>(f)(args); };
}
 

Но это не работает.Что я должен исправить?

Ответ №1:

Прежде всего, вам нужно My_func быть синтаксически корректным. У вас есть пакет args , который не расширен в лямбде. Тогда вам нужно tuple где-то упомянуть. C — это не экстрасенс.

К счастью, существует std::forward_as_tuple то, что делает именно то, что вам здесь нужно

 template <class F>
constexpr auto My_func(Famp;amp; f) {
    return [f = std::forward<F>(f)](autoamp;amp; args...) { return f(std::forward_as_tuple(args...)); };
}
 

Ответ №2:

 template <class F>
constexpr auto My_func(Famp;amp; f) 
{
   return [f = std::forward<F>(f)](autoamp;amp;... args) { 
        return f(std::make_tuple(std::forward<decltype(args)>(args)...)); 
   };
}