Добавление Foo& в std::vector

Я пишу макет для следующего интерфейса:

virtual void store(const Foo& container) = 0;

Поэтому в реализации я хочу сохранить то, что отправляется каждый раз в векторе, что-то вроде этого:

virtual void store(const Foo& container)
{
    _storedContainers.push_back(container);
}

Какой тип должен иметь _storedContainers, где _storedContainers является членом макета?

2 ответа

Решение

Если вы хотите сохранить const ссылка на Foo затем используйте boost::cref() а также boost::reference_wrapper поскольку простые ссылки не могут быть назначены и не могут быть сохранены в vector:

std::vector<boost::reference_wrapper<const Foo> > _storedContainers;

virtual void store(const Foo& container)
{
    _storedContainers.push_back(boost::cref(container));
}

Тем не менее, элементы в _storedContainers могут стать висячими ссылками, если объекты переданы store() уничтожены, пока еще требуется. Демоверсия в Интернете по адресу http://codepad.org/VOokOm6i.

Пример (с использованием эквивалентных версий C++11 cref() а также reference_wrapper ) http://ideone.com/0vVv8w.

Выражение container имеет тип const FooИтак, вы пытаетесь подтолкнуть Foo возражать в _storedContainers, Это означает _storedContainers должен быть контейнером Fooс, такие как std::vector<Foo>,

Другие вопросы по тегам