强制提升变体以存储指针

Force boost variant to store pointer

本文关键字:存储 指针      更新时间:2023-10-16

我使用boost::variant 进行存储,一个可能的数据成员是一个大型结构。所以二进制变体的大小至少是这个结构大小。在我的情况下,所有其他成员都非常小,例如 int 或 double。为了避免基本的大布局,有没有办法强制 boost::variant 将项目存储为指针?当然,我可以使用智能指针来存储这个大结构,但在这种情况下,get Methode 也可以用作指针访问。这不太好

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

大小为 500 字节

或者另一个小解决方案,但每个访问都必须处理指针

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

大小为 40 字节

是的,您可以将变体声明为

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 实例在堆上生存,但提供与没有递归包装器完全相同的接口和用法。