Недавно я искал полиморфную коллекцию для использования в C++
и наткнулся на буст base_collection
.Я вполне доволен этим, но итераторы коллекции, становящиеся недействительными после вставок, сильно ограничивают его использование для меня:
#include <boost/poly_collection/base_collection.hpp>
class base
{
public:
////
const string& get_name() const
{
return name;
}
////
};
class derived : public base
{
////
};
int main()
{
boost::base_collection<base> collection;
auto iterator = collection.insert(derived{"test"});
std::cout << iterator->get_name(); //"test"
for(auto i{0}; i < 100; ++i)
collection.insert(derived{"test" + i});
std::cout << iterator->get_name(); //not "test" anymore
return 0;
}
Указание пользовательского распределителя (например, boost::pool
) не решает проблемупрочь, потому что, очевидно, base_collection
всегда использует ::new
для выделения хранилища.
У кого-нибудь есть идеи, как сделать итераторы действительными?