Utility: fix function classes to have a common interface for virtual dispatch
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Erki 2021-08-22 23:18:08 +03:00
parent 1d05aac914
commit 9bf60d7e4e

View File

@ -11,11 +11,26 @@
namespace Utility namespace Utility
{ {
template<class>
class IFunction;
template<typename R, typename... Args>
class IFunction<R(Args...)>
{
public:
using result_type = R;
virtual ~IFunction()
{ }
virtual result_type operator()(Args... args) = 0;
};
template<class> template<class>
class Function; class Function;
template<typename R, typename... Args> template<typename R, typename... Args>
class Function<R(Args...)> class Function<R(Args...)> : public IFunction<R(Args...)>
{ {
public: public:
using result_type = R; using result_type = R;
@ -29,9 +44,13 @@ public:
assert(callable_); assert(callable_);
} }
result_type operator()(Args&&... args) ~Function() override
{ {
return (*callable_)(std::forward<Args>(args)...); }
result_type operator()(Args... args) override
{
return (*callable_)(args...);
} }
private: private:
@ -42,7 +61,7 @@ template<class, class>
class FunctionOwned; class FunctionOwned;
template<typename H, typename R, typename... Args> template<typename H, typename R, typename... Args>
class FunctionOwned<H, R(Args...)> class FunctionOwned<H, R(Args...)> : public IFunction<R(Args...)>
{ {
public: public:
using source = H; using source = H;
@ -57,9 +76,12 @@ public:
assert(callable_); assert(callable_);
} }
result_type operator()(Args&&... args) ~FunctionOwned() override
{ }
result_type operator()(Args... args) override
{ {
return (src_->*callable_)(std::forward<Args>(args)...); return (src_->*callable_)(args...);
} }
private: private: