我使用boost :: variant进行存储,一个可能的数据成员是一个大型结构。所以二元变体的大小至少是这个结构大小。在我的情况下,所有其他成员都非常小,如int或double。 为了避免基本的大型布局,有没有办法强制boost :: variant将项目存储为指针? 当然我可以使用智能指针来存储这个大型结构,但在这种情况下,获取Methode也可以作为指针访问..这不是很好
boost::variant<int,double,large_struct>>
500字节的大小
或者是其他小解决方案,但每次访问都必须处理指针
boost::variant<int,double,shared_ptr<large_struct>
40字节的大小
答案 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
实例存在于堆上,但是提供完全相同的接口和用法,就好像没有递归包装器一样。