41 lines
776 B
C++
41 lines
776 B
C++
template <typename Fun>
|
|
class Function;
|
|
|
|
|
|
template <typename Ret, typename... Args>
|
|
class function
|
|
{
|
|
private:
|
|
class callable_base
|
|
{
|
|
public:
|
|
virtual Ret call(Args...) = 0;
|
|
};
|
|
|
|
template <typename Fun>
|
|
class callable : public callable_base
|
|
{
|
|
private:
|
|
Fun _fun;
|
|
public:
|
|
callable(Fun fun):_fun(fun) {}
|
|
virtual Ret call(Args... args)
|
|
{ return _fun(std::forward<Args>(args)...); }
|
|
};
|
|
|
|
callable_base* _fun;
|
|
public:
|
|
Function() {}
|
|
|
|
template <typename Fun>
|
|
Function& operator=(Fun fun)
|
|
{
|
|
_fun = new callable<Fun>(fun);
|
|
return *this;
|
|
}
|
|
|
|
Ret operator()(Args... args) const
|
|
{ return _fun->call(std::forward<Args>(args)...); }
|
|
|
|
~Function() { delete _fun; }
|
|
}; |