function/Function.hpp

41 lines
790 B
C++
Raw Normal View History

template <typename Fun>
class Function;
template <typename Ret, typename... Args>
class Function<Ret(Args...)>
{
private:
class callable_base
{
public:
virtual Ret call(Args...) = 0;
};
template <typename Fun>
class callable : public callable_base
{
private:
2016-11-27 13:06:57 +00:00
Fun _fun;
public:
2016-11-27 13:06:57 +00:00
callable(Fun fun):_fun(fun) {}
virtual Ret call(Args... args)
2016-11-27 13:06:57 +00:00
{ return _fun(std::forward<Args>(args)...); }
};
2016-11-27 13:06:57 +00:00
callable_base* _fun;
public:
2016-11-27 13:06:57 +00:00
Function() {}
template <typename Fun>
Function& operator=(Fun fun)
{
_fun = new callable<Fun>(fun);
return *this;
}
2016-11-27 13:08:01 +00:00
Ret operator()(Args... args) const
{ return _fun->call(std::forward<Args>(args)...); }
2016-11-27 13:06:57 +00:00
~Function() { delete _fun; }
};