Принудительно повысить вариант для сохранения указателя
Я использую 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
Экземпляр живет в куче, но дает точно такой же интерфейс и использование, как если бы не было рекурсивной оболочки.