#include <iostream>
#include <vector>
using namespace std;
struct AbstractShape
{
virtual std::ostream& dump(std::ostream&) = 0;
};
struct Point : AbstractShape
{
Point(float x, float y) : x(x), y(y) {}
virtual std::ostream& dump(std::ostream& o) override
{
return o << "P[" << x << ":" << y << "]";
}
float x, y;
};
struct Line : AbstractShape
{
Line(float x1, float y1, float x2, float y2) : x1(x1), y1(y1), x2(x2), y2(y2) {}
virtual std::ostream& dump(std::ostream& o) override
{
return o << "L[" << x1 << ":" << y1 << "," << x2 << ":" << y2<< "]";
}
float x1, y1, x2, y2;
};
template<typename Object, typename Container, typename ...Args>
Object* construct(Container& c, Args... args)
{
Object* res = new Object(args...);
c.push_back(res);
return res;
}
int main() {
std::vector<AbstractShape*> container;
construct<Point>(container, 1, 2);
construct<Line>(container, 1, 2, 3, 4);
for (auto s : container)
s->dump(std::cout) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBBYnN0cmFjdFNoYXBlCnsKCXZpcnR1YWwgc3RkOjpvc3RyZWFtJiBkdW1wKHN0ZDo6b3N0cmVhbSYpID0gMDsKfTsKc3RydWN0IFBvaW50IDogQWJzdHJhY3RTaGFwZQp7CglQb2ludChmbG9hdCB4LCBmbG9hdCB5KSA6IHgoeCksIHkoeSkge30KCQoJCgl2aXJ0dWFsIHN0ZDo6b3N0cmVhbSYgZHVtcChzdGQ6Om9zdHJlYW0mIG8pIG92ZXJyaWRlCgl7CgkJcmV0dXJuIG8gPDwgIlBbIiA8PCB4IDw8ICI6IiA8PCB5IDw8ICJdIjsKCX0KCWZsb2F0IHgsIHk7Cn07CnN0cnVjdCBMaW5lIDogQWJzdHJhY3RTaGFwZQp7CglMaW5lKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKSA6IHgxKHgxKSwgeTEoeTEpLCB4Mih4MiksIHkyKHkyKSB7fQoKCXZpcnR1YWwgc3RkOjpvc3RyZWFtJiBkdW1wKHN0ZDo6b3N0cmVhbSYgbykgb3ZlcnJpZGUKCXsKCQlyZXR1cm4gbyA8PCAiTFsiIDw8IHgxIDw8ICI6IiA8PCB5MSA8PCAiLCIgPDwgeDIgPDwgIjoiIDw8IHkyPDwgIl0iOwoJfQoJCglmbG9hdCB4MSwgeTEsIHgyLCB5MjsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIE9iamVjdCwgdHlwZW5hbWUgQ29udGFpbmVyLCB0eXBlbmFtZSAuLi5BcmdzPgpPYmplY3QqIGNvbnN0cnVjdChDb250YWluZXImIGMsIEFyZ3MuLi4gYXJncykKewoJT2JqZWN0KiByZXMgPSBuZXcgT2JqZWN0KGFyZ3MuLi4pOwoJYy5wdXNoX2JhY2socmVzKTsKCXJldHVybiByZXM7Cn0KaW50IG1haW4oKSB7CglzdGQ6OnZlY3RvcjxBYnN0cmFjdFNoYXBlKj4gY29udGFpbmVyOwoJCgljb25zdHJ1Y3Q8UG9pbnQ+KGNvbnRhaW5lciwgMSwgMik7Cgljb25zdHJ1Y3Q8TGluZT4oY29udGFpbmVyLCAxLCAyLCAzLCA0KTsKCglmb3IgKGF1dG8gcyA6IGNvbnRhaW5lcikKCQlzLT5kdW1wKHN0ZDo6Y291dCkgPDwgc3RkOjplbmRsOwoKCXJldHVybiAwOwp9