Utility: fix function classes to have a common interface for virtual dispatch
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
1d05aac914
commit
9bf60d7e4e
@ -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:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user