51class ICEBERG_TEMPLATE_CLASS_EXPORT
FnOnce<R(Args...)> {
53 template <
typename Fn>
54 requires(!std::same_as<std::remove_cvref_t<Fn>,
FnOnce> &&
56 explicit FnOnce(Fn&& fn) : impl_(std::make_unique<ImplFor<Fn>>(std::forward<Fn>(fn))) {}
63 R operator()(Args... args) && {
64 return std::move(*impl_).Invoke(std::forward<Args>(args)...);
69 virtual ~Impl() =
default;
70 virtual R Invoke(Args&&... args) && = 0;
73 template <
typename Fn>
74 struct ImplFor final : Impl {
75 explicit ImplFor(Fn&& fn) : fn_(std::forward<Fn>(fn)) {}
76 R Invoke(Args&&... args) &&
override {
77 return std::invoke(std::move(fn_), std::forward<Args>(args)...);
79 std::remove_cvref_t<Fn> fn_;
82 std::unique_ptr<Impl> impl_;