// Copyright 2025 Dolphin Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include // TODO C++23: Replace with std::move_only_function. namespace Common { template class MoveOnlyFunction; template class MoveOnlyFunction { public: using result_type = R; MoveOnlyFunction() = default; template MoveOnlyFunction(F&& f) : m_ptr{std::make_unique>(std::forward(f))} { } result_type operator()(Args... args) const { return m_ptr->Invoke(std::forward(args)...); } explicit operator bool() const { return m_ptr != nullptr; }; void swap(MoveOnlyFunction& other) { m_ptr.swap(other.m_ptr); } private: struct FuncBase { virtual ~FuncBase() = default; virtual result_type Invoke(Args...) = 0; }; template struct Func : FuncBase { Func(F&& f) : func{std::forward(f)} {} result_type Invoke(Args... args) override { return func(std::forward(args)...); } F func; }; std::unique_ptr m_ptr; }; } // namespace Common