#include <iostream>
#include <vector>
#include <memory>
struct Wheel;
struct Engine;
struct Pipe;
template<class T>
using Ptr = std::unique_ptr<T>;
struct Component
{
virtual ~Component() = default;
};
struct Car
{
Car() { std::cout << "Yoba car ctor called\n"; }
~Car() { std::cout << "Car dtor called.\n"; }
std::vector<Ptr<Component>> m_carComponents;
template<typename T, typename... TArgs>
void createComponent(TArgs&&... mArgs)
{
auto result(new T(std::forward<TArgs>(mArgs)...));
m_carComponents.push_back(Ptr<Component>(result));
}
};
struct Wheel : public Component
{
Wheel(Car& car)
: m_car(car)
{
std::cout << "Wheel attached to car.\n";
}
~Wheel() { std::cout << "Wheel dtor.\n"; }
Car& m_car;
};
// аналогично остальные ебучие классы
int main()
{
Ptr<Car> car = std::make_unique<Car>();
car->createComponent<Wheel>(*car);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IFdoZWVsOwpzdHJ1Y3QgRW5naW5lOwpzdHJ1Y3QgUGlwZTsKCnRlbXBsYXRlPGNsYXNzIFQ+CnVzaW5nIFB0ciA9IHN0ZDo6dW5pcXVlX3B0cjxUPjsKCnN0cnVjdCBDb21wb25lbnQKewogICAgdmlydHVhbCB+Q29tcG9uZW50KCkgPSBkZWZhdWx0Owp9OwoKc3RydWN0IENhcgp7CiAgICBDYXIoKSB7IHN0ZDo6Y291dCA8PCAiWW9iYSBjYXIgY3RvciBjYWxsZWRcbiI7IH0KICAgIH5DYXIoKSB7IHN0ZDo6Y291dCA8PCAiQ2FyIGR0b3IgY2FsbGVkLlxuIjsgfQoKICAgIHN0ZDo6dmVjdG9yPFB0cjxDb21wb25lbnQ+PiBtX2NhckNvbXBvbmVudHM7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVEFyZ3M+IAogICAgdm9pZCBjcmVhdGVDb21wb25lbnQoVEFyZ3MmJi4uLiBtQXJncykKICAgIHsKICAgICAgICBhdXRvIHJlc3VsdChuZXcgVChzdGQ6OmZvcndhcmQ8VEFyZ3M+KG1BcmdzKS4uLikpOwogICAgICAgIG1fY2FyQ29tcG9uZW50cy5wdXNoX2JhY2soUHRyPENvbXBvbmVudD4ocmVzdWx0KSk7CiAgICB9Cn07CgpzdHJ1Y3QgV2hlZWwgOiBwdWJsaWMgQ29tcG9uZW50CnsKICAgIFdoZWVsKENhciYgY2FyKQogICAgICAgIDogbV9jYXIoY2FyKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiV2hlZWwgYXR0YWNoZWQgdG8gY2FyLlxuIjsKICAgIH0KCiAgICB+V2hlZWwoKSB7IHN0ZDo6Y291dCA8PCAiV2hlZWwgZHRvci5cbiI7IH0KCiAgICBDYXImICAgIG1fY2FyOwp9OwoKLy8g0LDQvdCw0LvQvtCz0LjRh9C90L4g0L7RgdGC0LDQu9GM0L3Ri9C1INC10LHRg9GH0LjQtSDQutC70LDRgdGB0YsgCgppbnQgbWFpbigpCnsKICAgIFB0cjxDYXI+IGNhciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2FyPigpOwogICAgY2FyLT5jcmVhdGVDb21wb25lbnQ8V2hlZWw+KCpjYXIpOwoKCiAgICByZXR1cm4gMDsKfQ==