#pragma once #include namespace utils { template class optional_function; template class optional_function { std::function func; public: optional_function() = default; optional_function(std::function f) : func(std::move(f)) { } template requires(std::is_invocable_r_v) optional_function(F&& f) : func(std::forward(f)) { } template requires(std::is_invocable_r_v) optional_function& operator=(F&& f) { func = std::forward(f); return *this; } Ret operator()(Args... args) const { if (func) { return func(std::forward(args)...); } if constexpr (!std::is_void_v) { return Ret(); } } explicit operator bool() const noexcept { return static_cast(func); } }; }