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
{
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>
class Function;
template<typename R, typename... Args>
class Function<R(Args...)>
class Function<R(Args...)> : public IFunction<R(Args...)>
{
public:
using result_type = R;
@ -29,9 +44,13 @@ public:
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:
@ -42,7 +61,7 @@ template<class, class>
class FunctionOwned;
template<typename H, typename R, typename... Args>
class FunctionOwned<H, R(Args...)>
class FunctionOwned<H, R(Args...)> : public IFunction<R(Args...)>
{
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>(args)...);
return (src_->*callable_)(args...);
}
private: