#ifndef COLLECTION_H #define COLLECTION_H #include #include template class Collection { public: using Ptr = std::unique_ptr; std::vector objects; template const auto & create(Params &&... params) { return objects.emplace_back(std::make_unique(std::forward(params)...)); } template void apply(const M & m, Params &&... params) const { std::for_each(objects.cbegin(), objects.cend(), [&m, ¶ms...](auto && op) { if (auto o = dynamic_cast(op.get())) { std::invoke(m, o, std::forward(params)...); } }); } }; #endif