From 9bf60d7e4ed0495500621635c72f71f0e9d5b76f Mon Sep 17 00:00:00 2001 From: Erki Date: Sun, 22 Aug 2021 23:18:08 +0300 Subject: [PATCH] Utility: fix function classes to have a common interface for virtual dispatch --- Utility/Inc/utility_function.hpp | 34 ++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/Utility/Inc/utility_function.hpp b/Utility/Inc/utility_function.hpp index 2ea32c8..6812a8c 100644 --- a/Utility/Inc/utility_function.hpp +++ b/Utility/Inc/utility_function.hpp @@ -11,11 +11,26 @@ namespace Utility { +template +class IFunction; + +template +class IFunction +{ +public: + using result_type = R; + + virtual ~IFunction() + { } + + virtual result_type operator()(Args... args) = 0; +}; + template class Function; template -class Function +class Function : public IFunction { public: using result_type = R; @@ -29,9 +44,13 @@ public: assert(callable_); } - result_type operator()(Args&&... args) + ~Function() override { - return (*callable_)(std::forward(args)...); + } + + result_type operator()(Args... args) override + { + return (*callable_)(args...); } private: @@ -42,7 +61,7 @@ template class FunctionOwned; template -class FunctionOwned +class FunctionOwned : public IFunction { public: using source = H; @@ -57,9 +76,12 @@ public: assert(callable_); } - result_type operator()(Args&&... args) + ~FunctionOwned() override + { } + + result_type operator()(Args... args) override { - return (src_->*callable_)(std::forward(args)...); + return (src_->*callable_)(args...); } private: