#include<iostream>
#include<memory>
template<class T>
class Storage{
public: void add(T& t){ std::cout << "Storage<T>::add(T&)\n"; }
};
template<class T>
class Storage<std::unique_ptr<T>> : public Storage<T*>{
public: using Storage<T*>::add;
public: void add(std::unique_ptr<T>& t){ std::cout << "Storage<unique_ptr<T>>::add(std::unique_ptr<T>&)\n"; }
};
int main ()
{
int i;
Storage<int> si;
si.add(i);
int* pi = new int;
Storage<std::unique_ptr<int>> su;
su.add(pi);
std::unique_ptr<int> ui;
su.add(ui);
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPG1lbW9yeT4KCnRlbXBsYXRlPGNsYXNzIFQ+ICAKY2xhc3MgU3RvcmFnZXsKICBwdWJsaWM6IHZvaWQgYWRkKFQmIHQpeyBzdGQ6OmNvdXQgPDwgIlN0b3JhZ2U8VD46OmFkZChUJilcbiI7IH0KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIFN0b3JhZ2U8c3RkOjp1bmlxdWVfcHRyPFQ+PiA6IHB1YmxpYyBTdG9yYWdlPFQqPnsKICBwdWJsaWM6IHVzaW5nIFN0b3JhZ2U8VCo+OjphZGQ7CiAgcHVibGljOiB2b2lkIGFkZChzdGQ6OnVuaXF1ZV9wdHI8VD4mIHQpeyBzdGQ6OmNvdXQgPDwgIlN0b3JhZ2U8dW5pcXVlX3B0cjxUPj46OmFkZChzdGQ6OnVuaXF1ZV9wdHI8VD4mKVxuIjsgfQp9OwoKaW50IG1haW4gKCkKewogIGludCBpOwogIFN0b3JhZ2U8aW50PiBzaTsgCiAgc2kuYWRkKGkpOwogIGludCogcGkgPSBuZXcgaW50OwogIFN0b3JhZ2U8c3RkOjp1bmlxdWVfcHRyPGludD4+IHN1OyAKICBzdS5hZGQocGkpOwogIHN0ZDo6dW5pcXVlX3B0cjxpbnQ+IHVpOwogIHN1LmFkZCh1aSk7Cn0K