#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);
}