Есть ли способ избежать аннулирования итератора при использовании boost :: base :: collection? - PullRequest
0 голосов
/ 08 декабря 2018

Недавно я искал полиморфную коллекцию для использования в 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 для выделения хранилища.

У кого-нибудь есть идеи, как сделать итераторы действительными?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...