#include <iostream>
#include <type_traits>
#include <list>
#include <vector>
#include <memory>
struct Base
{
virtual void doSomething(int) = 0;
};
struct DerivedOne: public Base
{
void doSomething(int)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};
struct DerivedTwo: public Base
{
void doSomething(int)
{
std::cout << __PRETTY_FUNCTION__ << '\n';
}
};
template<template<class, class...> class C, class... Args>
void myFunc(C<std::shared_ptr<Base>, Args...>& objs, int y)
{
for(auto it = std::begin(objs); it != std::end(objs); ++it)
(*it)->doSomething(y);
}
int main()
{
// list of shared pointers to Base
std::list<std::shared_ptr<Base>> objs;
objs.push_back(std::make_shared<DerivedOne>());
objs.push_back(std::make_shared<DerivedTwo>());
myFunc(objs, 42);
// vector of shared pointers to base
std::vector<std::shared_ptr<Base>> vec(objs.rbegin(), objs.rend());;
myFunc(vec,42);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxsaXN0PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IEJhc2UKewogICAgdmlydHVhbCB2b2lkIGRvU29tZXRoaW5nKGludCkgPSAwOwp9OwoKc3RydWN0IERlcml2ZWRPbmU6IHB1YmxpYyBCYXNlCnsKICAgIHZvaWQgZG9Tb21ldGhpbmcoaW50KQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICdcbic7CiAgICB9Cn07CgpzdHJ1Y3QgRGVyaXZlZFR3bzogcHVibGljIEJhc2UKewogICAgdm9pZCBkb1NvbWV0aGluZyhpbnQpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgJ1xuJzsKICAgIH0KfTsKCnRlbXBsYXRlPHRlbXBsYXRlPGNsYXNzLCBjbGFzcy4uLj4gY2xhc3MgQywgY2xhc3MuLi4gQXJncz4Kdm9pZCBteUZ1bmMoQzxzdGQ6OnNoYXJlZF9wdHI8QmFzZT4sIEFyZ3MuLi4+JiBvYmpzLCBpbnQgeSkKewogICAgZm9yKGF1dG8gaXQgPSBzdGQ6OmJlZ2luKG9ianMpOyBpdCAhPSBzdGQ6OmVuZChvYmpzKTsgKytpdCkKICAgICAgICAoKml0KS0+ZG9Tb21ldGhpbmcoeSk7Cn0KCmludCBtYWluKCkKewogICAgLy8gbGlzdCBvZiBzaGFyZWQgcG9pbnRlcnMgdG8gQmFzZQogICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxCYXNlPj4gb2JqczsKICAgIAogICAgb2Jqcy5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxEZXJpdmVkT25lPigpKTsKICAgIG9ianMucHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8RGVyaXZlZFR3bz4oKSk7CiAgICBteUZ1bmMob2JqcywgNDIpOwogICAgCiAgICAvLyB2ZWN0b3Igb2Ygc2hhcmVkIHBvaW50ZXJzIHRvIGJhc2UKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxCYXNlPj4gdmVjKG9ianMucmJlZ2luKCksIG9ianMucmVuZCgpKTs7CiAgICBteUZ1bmModmVjLDQyKTsKfQo=