std::visit
требует, чтобы у каждого типа внутри варианта было допустимое «действие».Если бы func
имел бы std::function<void(int)>
вместо std::function<void(void)>
, как это происходит сейчас, тогда не было бы никакого способа воздействовать на него.И поскольку это (can) зависит от времени выполнения, std::visit
должен проверить во время компиляции, что каждая возможная альтернатива варианта может использоваться для вызова вашего вызываемого объекта.
Например, вы можете объединить лямбды вместе, илииметь if constexpr
каскад для каждого типа в варианте.
template<typename ...Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<typename ...Ts> overloaded(Ts...) -> overloaded<Ts...>;
std::visit(overloaded{
[](const std::function<void(void)> &Void) { std::invoke(Void); },
[](const std::function<void(int)> &Int) { std::invoke(Int, 1); }}, func);