#ifndef KYTY_COMMON_UNIQUEFUNCTION_H_ #define KYTY_COMMON_UNIQUEFUNCTION_H_ #include #include #include namespace Common { template class UniqueFunction { class CallableBase { public: virtual ~CallableBase() = default; virtual Result Invoke(Args&&... args) = 0; }; template class Callable final: public CallableBase { public: explicit Callable(Function function): m_function(std::move(function)) {} Result Invoke(Args&&... args) override { return m_function(std::forward(args)...); } private: Function m_function; }; public: UniqueFunction() = default; template UniqueFunction(Function&& function) : m_callable(std::make_unique>>( std::forward(function))) {} UniqueFunction(UniqueFunction&&) noexcept = default; UniqueFunction& operator=(UniqueFunction&&) noexcept = default; UniqueFunction(const UniqueFunction&) = delete; UniqueFunction& operator=(const UniqueFunction&) = delete; Result operator()(Args... args) const { return m_callable->Invoke(std::forward(args)...); } explicit operator bool() const noexcept { return m_callable != nullptr; } private: std::unique_ptr m_callable; }; } // namespace Common #endif // KYTY_COMMON_UNIQUEFUNCTION_H_