#include <iostream>
#include <vector>
#include <memory>
using namespace std;
struct A { void what_type() { cout<<"A"<<endl; }};
struct B { void what_type() { cout<<"B"<<endl; }};
struct U { void what_type() { cout<<"U"<<endl; }};
struct V { void what_type() { cout<<"V"<<endl; }};
class MyCommonAncestor {
public:
virtual void common_operation1()=0;
virtual ~MyCommonAncestor() {}
};
template <class X, class Y>
class MyTemplateClass : public MyCommonAncestor {
X myx;
Y myY;
public:
void common_operation1() override { // addresses specific objects of type X and Y
myx.what_type();
myY.what_type();
};
X operation2(const Y& y) {};
~MyTemplateClass() { // to demonstrate automatic destruction for shared ptr
cout<<"object destroyed"<<endl;
}
};
int main() {
vector<shared_ptr<MyCommonAncestor>> myVector;
myVector.push_back(make_shared<MyTemplateClass<A,B>>());
myVector.push_back(make_shared<MyTemplateClass<U,V>>());
for (auto& x: myVector)
x->common_operation1();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEEgeyB2b2lkIHdoYXRfdHlwZSgpIHsgY291dDw8IkEiPDxlbmRsOyB9fTsKc3RydWN0IEIgeyB2b2lkIHdoYXRfdHlwZSgpIHsgY291dDw8IkIiPDxlbmRsOyB9fTsKc3RydWN0IFUgeyB2b2lkIHdoYXRfdHlwZSgpIHsgY291dDw8IlUiPDxlbmRsOyB9fTsKc3RydWN0IFYgeyB2b2lkIHdoYXRfdHlwZSgpIHsgY291dDw8IlYiPDxlbmRsOyB9fTsKCmNsYXNzIE15Q29tbW9uQW5jZXN0b3IgewpwdWJsaWM6ICAKICAgIHZpcnR1YWwgdm9pZCBjb21tb25fb3BlcmF0aW9uMSgpPTA7CiAgICB2aXJ0dWFsIH5NeUNvbW1vbkFuY2VzdG9yKCkge30KfTsgCgp0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4gCmNsYXNzIE15VGVtcGxhdGVDbGFzcyA6IHB1YmxpYyBNeUNvbW1vbkFuY2VzdG9yIHsKICAgIFggbXl4OyAKICAgIFkgbXlZOyAKcHVibGljOiAgCiAgICB2b2lkIGNvbW1vbl9vcGVyYXRpb24xKCkgb3ZlcnJpZGUgeyAgLy8gYWRkcmVzc2VzIHNwZWNpZmljIG9iamVjdHMgb2YgdHlwZSBYIGFuZCBZCiAgICAJbXl4LndoYXRfdHlwZSgpOwogICAgCW15WS53aGF0X3R5cGUoKTsKICAgIH07IAogICAgWCBvcGVyYXRpb24yKGNvbnN0IFkmIHkpIHt9OyAKICAgIH5NeVRlbXBsYXRlQ2xhc3MoKSB7ICAgLy8gdG8gZGVtb25zdHJhdGUgYXV0b21hdGljIGRlc3RydWN0aW9uIGZvciBzaGFyZWQgcHRyCiAgICAJY291dDw8Im9iamVjdCBkZXN0cm95ZWQiPDxlbmRsOwogICAgfSAKfTsKCmludCBtYWluKCkgewoJdmVjdG9yPHNoYXJlZF9wdHI8TXlDb21tb25BbmNlc3Rvcj4+IG15VmVjdG9yOyAKCW15VmVjdG9yLnB1c2hfYmFjayhtYWtlX3NoYXJlZDxNeVRlbXBsYXRlQ2xhc3M8QSxCPj4oKSk7IAoJbXlWZWN0b3IucHVzaF9iYWNrKG1ha2Vfc2hhcmVkPE15VGVtcGxhdGVDbGFzczxVLFY+PigpKTsgCglmb3IgKGF1dG8mIHg6IG15VmVjdG9yKQoJICAgIHgtPmNvbW1vbl9vcGVyYXRpb24xKCk7IAoJcmV0dXJuIDA7Cn0=