#include <memory>
#include <functional>

//all done assuming interface is `void (*)()`

struct function_interface {
    virtual void operator()()=0;
    virtual std::unique_ptr<function_interface> copy()=0;
};
template<class T>
class function_impl : public function_interface  {
    T t;
public:
    function_impl(T t_) : t(std::move(t_)) {};
    void operator()() {t();}
    virtual std::unique_ptr<function_interface> copy()
    {return std::unique_ptr<function_interface>(new function_impl(t));}
};

class function {
    std::unique_ptr<function_interface> ptr;
public: 
    template<class T>
    function(T t) : ptr(new function_impl<T>(std::move(t))) {}
    function(const function& rhs) : ptr(rhs.ptr->copy()) {}
    function(function&& rhs) : ptr(std::move(rhs.ptr)) {}
    void operator()() {(*ptr)();}
};

#include <iostream>
struct oid {
    void operator()() {std::cout << "oid";}
};
void func() {std::cout << "function";}

int main() {
    function a(func);
    function b(a);
    b();    
    function c((oid()));
    c();
    function d(c);
    d();    
}