Принудительно повысить вариант для сохранения указателя

Я использую Boost:: Вариант для хранения, и один из возможных членов данных является большой структурой. Таким образом, размер бинарного варианта равен по крайней мере этому размеру структуры. Все остальные члены в моем случае очень маленькие, как int или double. Чтобы избежать базового большого макета, есть ли способ заставить boost::variable сохранять элемент в качестве указателя? Конечно, я мог бы использовать умный указатель для хранения этой большой структуры, но в этом случае метод Get также будет работать как доступ к указателю... это не так хорошо

       boost::variant<int,double,large_struct>>

Размер 500 байт

Или другое небольшое решение, но каждый доступ должен иметь дело с указателем

       boost::variant<int,double,shared_ptr<large_struct>

Размер 40 байт

1 ответ

Да, вы можете объявить вариант как

boost::variant<int,double,boost::recursive_wrapper <large_struct>>>

Рекурсивная обертка обычно используется для случая, когда large_struct является неполным типом в то время, когда вы объявляете вариант. Например, что если этот вариант должен быть членом large_struct,

recursive_wrapper<T> внутренне просто указатель T*, но вариант знает об этом указателе и прозрачно разыменовывает его для вас. Это для случая, когда тот факт, что он должен быть указателем, является "деталью", о которой пользователь не должен думать.

Это отлично работает для вашего случая использования, хотя. С помощью recursive_wrapper<large_struct> вместо large_struct делает large_struct Экземпляр живет в куче, но дает точно такой же интерфейс и использование, как если бы не было рекурсивной оболочки.

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