#include <iostream>
#include <memory>
using namespace std;
class Base{
public:
virtual void do_something(int a) = 0;
virtual ~Base(){};
};
template<typename T>
class Concrete : public Base{
T _t;
public:
Concrete(){};
virtual void do_something(int a);
virtual ~Concrete();
};
template<typename T>
void Concrete<T>::do_something(int a){
std::cout << a << std::endl;
}
template<typename T>
Concrete<T>::~Concrete(){}
int main(int argc, char **argv) {
std::unique_ptr<Base> b(new Concrete<int>());
b->do_something(5);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQmFzZXsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIGRvX3NvbWV0aGluZyhpbnQgYSkgPSAwOwogICAgdmlydHVhbCB+QmFzZSgpe307Cgp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgQ29uY3JldGUgOiBwdWJsaWMgQmFzZXsKCiAgICBUIF90OwpwdWJsaWM6CiAgICBDb25jcmV0ZSgpe307CiAgICB2aXJ0dWFsIHZvaWQgZG9fc29tZXRoaW5nKGludCBhKTsKICAgIHZpcnR1YWwgfkNvbmNyZXRlKCk7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIENvbmNyZXRlPFQ+Ojpkb19zb21ldGhpbmcoaW50IGEpewogICAgc3RkOjpjb3V0IDw8IGEgPDwgc3RkOjplbmRsOwp9CnRlbXBsYXRlPHR5cGVuYW1lIFQ+CkNvbmNyZXRlPFQ+Ojp+Q29uY3JldGUoKXt9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCgogICAgc3RkOjp1bmlxdWVfcHRyPEJhc2U+IGIobmV3IENvbmNyZXRlPGludD4oKSk7CiAgICBiLT5kb19zb21ldGhpbmcoNSk7Cn0=