#include <memory>
#include <utility>
#include <iostream>


template <class T>
class Hoge {
    std::unique_ptr<T> p;
    Hoge(Hoge const & o);
    Hoge & operator = (Hoge const & o);
public:
    explicit Hoge(T && o): p(new T(std::move(o))) { }
    explicit Hoge(T const & o): p(new T(o)) { }
    Hoge(Hoge && o): p(std::move(o.p)) { }
    Hoge & operator = (Hoge && o) { p.swap(o.p); }
    template <class U> void operator () (U * q) const { (*p)(q); }
};

template <class T> 
Hoge<T> MakeHoge(T && o) { return Hoge<T>(std::forward<T>(o)); }


int main(void) {
    auto d = MakeHoge([] (int * p) { std::cout << "DELETE!" << std::endl; delete p; });
    std::shared_ptr<int> pair(new int(0), std::move(d));
    return 0;
}

