Проблема в том, что вы должны использовать частичную специализацию
template <typename>
struct func_wrapper;
template <typename Ret, typename... Args>
struct func_wrapper<Ret(Args...)>
{
// ...
};
Если вы напишите
template <typename Ret, typename... Args>
struct func_wrapper
{
// ...
};
объявляет f
как
func_wrapper<void(int, float)> f;
у вас есть то, что Ret
выводится как void(int, float)
, а список Args...
variadic выводится как пустой список.
Итак, когда вы определяете
using Func = std::function<Ret(Args...)>;
объявление Func
становится
// ............................V..........VVV function-function type ?
using Func = std::function<void(int, float)()>;
, что дает ошибку «error: function returning the function».
Вы должны объявить func_wrapper
как получающее одно имя типа
template <typename>
struct func_wrapper;
, чтобы вы могли передать тип функции (void(int, float)
в вашем примере) в качестве параметра шаблона, а затем специализацию шаблона
template <typename Ret, typename... Args>
struct func_wrapper<Ret(Args...)>
{
// ...
};
может разрешить возвращаемый тип и типы аргументов из типа функции.