强制提升变量来存储指针

时间:2017-10-16 17:55:05

标签: c++ pointers boost variant

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

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

500字节的大小

或者是其他小解决方案,但每次访问都必须处理指针

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

40字节的大小

1 个答案:

答案 0 :(得分:3)

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

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