#include <memory>
template<class T>
struct call_drop {
void operator()(T* p) const {p->drop();}
};
template<class T, class U>
std::unique_ptr<T, call_drop<T>> make_drop_unique(U&& obj)
{return std::unique_ptr<T, call_drop<T>>(new T(std::forward<U>(obj)));}
template<class T>
std::unique_ptr<T, call_drop<T>> make_drop_unique()
{return std::unique_ptr<T, call_drop<T>>(new T());}
struct thingy {
void drop(){};
};
int main() {
auto ptr1 = make_drop_unique<thingy>(thingy());
auto ptr2 = make_drop_unique<thingy>();
}
I2luY2x1ZGUgPG1lbW9yeT4KCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBjYWxsX2Ryb3AgewogICAgdm9pZCBvcGVyYXRvcigpKFQqIHApIGNvbnN0IHtwLT5kcm9wKCk7fQp9OwoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4Kc3RkOjp1bmlxdWVfcHRyPFQsIGNhbGxfZHJvcDxUPj4gbWFrZV9kcm9wX3VuaXF1ZShVJiYgb2JqKQp7cmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxULCBjYWxsX2Ryb3A8VD4+KG5ldyBUKHN0ZDo6Zm9yd2FyZDxVPihvYmopKSk7fQp0ZW1wbGF0ZTxjbGFzcyBUPgpzdGQ6OnVuaXF1ZV9wdHI8VCwgY2FsbF9kcm9wPFQ+PiBtYWtlX2Ryb3BfdW5pcXVlKCkKe3JldHVybiBzdGQ6OnVuaXF1ZV9wdHI8VCwgY2FsbF9kcm9wPFQ+PihuZXcgVCgpKTt9CgpzdHJ1Y3QgdGhpbmd5IHsKICAgIHZvaWQgZHJvcCgpe307Cn07CgppbnQgbWFpbigpIHsKICAgIGF1dG8gcHRyMSA9IG1ha2VfZHJvcF91bmlxdWU8dGhpbmd5Pih0aGluZ3koKSk7CiAgICBhdXRvIHB0cjIgPSBtYWtlX2Ryb3BfdW5pcXVlPHRoaW5neT4oKTsKfQ==