48class ICEBERG_TEMPLATE_CLASS_EXPORT
FnOnce<R(Args...)> {
50 template <
typename Fn>
51 requires(!std::same_as<std::remove_cvref_t<Fn>,
FnOnce> &&
53 explicit FnOnce(Fn&& fn) : impl_(std::make_unique<ImplFor<Fn>>(std::forward<Fn>(fn))) {}
60 R operator()(Args... args) && {
61 return std::move(*impl_).Invoke(std::forward<Args>(args)...);
66 virtual ~Impl() =
default;
67 virtual R Invoke(Args&&... args) && = 0;
70 template <
typename Fn>
71 struct ImplFor final : Impl {
72 explicit ImplFor(Fn&& fn) : fn_(std::forward<Fn>(fn)) {}
73 R Invoke(Args&&... args) &&
override {
74 return std::invoke(std::move(fn_), std::forward<Args>(args)...);
76 std::remove_cvref_t<Fn> fn_;
79 std::unique_ptr<Impl> impl_;