#include <iostream>
#include <functional>
#include <algorithm>
#include <vector>
#include <memory>
struct A
{
A()
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
virtual void f() const
{
std::cout << "A";
}
};
struct B : public A
{
B()
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
virtual void f() const override
{
std::cout << "B";
}
};
struct C : public B
{
C()
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
virtual void f() const override
{
std::cout << "C";
}
};
struct Test
{
std::vector<std::shared_ptr<A>> vec;
template<class... Args>
Test(Args&&... args) :
vec { std::make_shared<std::remove_reference_t<Args>>(std::forward<Args>(args))... }
{
}
void print() const
{
for (auto const& ptr : vec)
ptr->f();
std::cout.put('\n');
}
};
int main()
{
Test test { A(), B(), C() };
test.print();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1lbW9yeT4KCnN0cnVjdCBBCnsKICAgIEEoKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICdcbic7CiAgICB9CiAgICAKICAgIHZpcnR1YWwgdm9pZCBmKCkgY29uc3QKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkEiOwogICAgfQp9OwoKCnN0cnVjdCBCIDogcHVibGljIEEKewogICAgQigpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgJ1xuJzsKICAgIH0KICAgIAogICAgdmlydHVhbCB2b2lkIGYoKSBjb25zdCBvdmVycmlkZQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQiI7CiAgICB9Cn07CiAgICAgICAgCiAgICAgICAgCnN0cnVjdCBDIDogcHVibGljIEIKewogICAgQygpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgJ1xuJzsKICAgIH0KICAgIAogICAgdmlydHVhbCB2b2lkIGYoKSBjb25zdCBvdmVycmlkZQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiQyI7CiAgICB9Cn07CgpzdHJ1Y3QgVGVzdAp7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QT4+IHZlYzsKCiAgICB0ZW1wbGF0ZTxjbGFzcy4uLiBBcmdzPgogICAgVGVzdChBcmdzJiYuLi4gYXJncykgOgogICAgICAgIHZlYyB7IHN0ZDo6bWFrZV9zaGFyZWQ8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8QXJncz4+KHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKSkuLi4gfQogICAgewogICAgfQogICAgCiAgICB2b2lkIHByaW50KCkgY29uc3QKICAgIHsKICAgICAgICBmb3IgKGF1dG8gY29uc3QmIHB0ciA6IHZlYykKICAgICAgICAgICAgcHRyLT5mKCk7CiAgICAgICAgc3RkOjpjb3V0LnB1dCgnXG4nKTsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgVGVzdCB0ZXN0IHsgQSgpLCBCKCksIEMoKSB9OwogICAgdGVzdC5wcmludCgpOwp9Cg==