Это не может работать, потому что вы, по сути, пытаетесь создать это:
std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<std::variant<Integer, Float, std::function<...()>>()>>()>>()>>()>>()>>()>>()>>()>>()>>()>>;
Таким образом, в сущности, у вас есть бесконечная рекурсия внутри объявлений типов.
Вам нужно обойти это, используя какой-то тип, который не имеет рекурсивного определения, но использование перенаправленного struct
, как вы предлагаете, не является опцией, поскольку std::variant
допускает только полные типы.
Что вы можете сделать, так это объявить struct
, а затем использовать контейнер / упаковщик / умный указатель по вашему выбору (например, std::unique_ptr<Function>
) в вашем std::variant
:
struct Function;
using Value = std::variant<Integer, Float, std::unique_ptr<Function>>;
struct Function : std::function<Value()> {};