Добавление 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>
,