【发布时间】:2014-02-06 19:30:23
【问题描述】:
我需要有效的方法将不同类型的值(int、float、QString 或 std::string、bool)存储在像 QVariant 这样的“通用”容器之一中。
我想归档更少的内存使用。
我更喜欢不存储内部值类型的容器,因为这是开销。
我应该使用哪一个?
【问题讨论】:
-
如果你真的想要一个不存储内部值类型的容器,你可以使用
std::unique_ptr<void>。但是这种类型的对象意味着“我引用了一些你不再知道如何阅读的重要数据”,所以对我来说似乎毫无意义。 -
但是我们可以用
typeid指令检查任何对象的类型,不是吗? -
@VitalyIsaev 的主要要求是使用
typeid隐含意味着您必须启用RTTI。此外,这种解决方案依赖于c++ type erasure技术,我不知道这会在多大程度上影响您的RTTI为您提供正确答案的能力。例如stackoverflow.com/questions/5450159/type-erasure-techniques -
正如here 所说,
typeid只有在您使用多态性时才能以您想要的方式工作。如果在void指针上使用typeid,它将返回void*,如果在取消引用的void指针上使用它,则程序不应编译,因为不允许取消引用void指针.此外,即使它以您想要的方式工作,您提出的库也可能会使用typeid运算符实现。 -
@tmporaries 你基本上离“未定义行为主题公园”;使用
union和void pointers,获得UB 非常容易,如果您真的知道自己在做什么,那么这种操作非常有用。如果您需要空间,请对内存中的内容使用压缩算法并保持简单。
标签: c++ boost boost-variant qvariant boost-any