Ситуация очень отличается от связанного вопроса. Вы не имеете дело с предварительно выделенным хранилищем, у вас уже есть данные для объектов. Кроме того, вы хотите, чтобы обе стороны могли изменять вектор или, другими словами, они совместно владели.
Это не тривиально. Вы можете предоставить «класс представления», который предлагает другой набор операций с тем же вектором или предлагает то же самое для семейства свободных функций. В любом случае они должны иметь ссылочную семантику.
Пример бесплатной функции
template<typename T>
void push_back_foo(std::vector<uint8_t>& vec, T&& t)
{
auto it = vec.insert(vec.end(), sizeof(Foo), {});
new (&*it) Foo{std::forward<T>(t)};
}
И так далее для всех других функций. Они отображают операции на стороне Foo
на операции на стороне uint8_t
.
Примечание: выполнение арифметики с указателем для результирующего вектора является формально неопределенным поведением, поскольку там нет массива Foo
. При работе с наложением двоичных данных на фасад обычно понимается, что компиляторы не сожгут ваш дом, и такие формальности игнорируются.