我正在编写代码,直到现在我才使用这样的结构:
struct s{
enum Types { zero = 0, one, two };
unsigned int type;
void* data;
}
我需要一些通用结构来存储来自不同类的数据,我想在std :: vector中使用它,这就是为什么我不能使用模板的原因。什么是更好的选择:工会或无效指针?
Void指针只分配我需要的空间,但是由于某种原因c ++是强类型语言,并且在我需要使用这些数据的地方投射不是应该设计c ++代码的方式。正如我所读到的,除非别无选择,否则不应使用void指针。
那个替代方案可能是工会。它们带有c ++,并为每个成员使用相同的内存空间,非常类似于void指针。然而,它们的价格是合理的 - 分配的空间是联合中最大元素的大小,在我看来,大小之间的差异很大。
这是相当风格和“正确的语言使用”问题,因为这两种方式都可以完成我需要做的事情,但我无法确定精美的程式化c ++代码是否可以为浪费的内存付出代价(尽管这些日子里的内存不是'一个很大的问题)。
答案 0 :(得分:5)
如果要存储异类型的对象,请考虑boost::any
或boost::variant
。
在决定使用哪一个之前,先看一下比较:
希望它能帮助您做出正确的决定。从标准库中选择一个和任何容器来存储对象std::vector<boost::any>
,std::vector<boost::variant>
或任何其他容器。
答案 1 :(得分:1)
基本上,它是一种类型安全的联合,在这种情况下,似乎工会是迄今为止最合适的答案。可以使用void*
,但这意味着动态分配,您必须维护Types
enum
和表格以进行投射。
内存限制可能会使void*
成为可接受的选择,但这不是“整洁”的答案,在boost::variant
和普通union
之前我都不会这样做显示是不可接受的。
答案 2 :(得分:1)
如果你的类有足够的共同点放在同一个容器中,给它们一个带有虚析构函数的基类,可能还有一个虚拟成员函数来检索你的类型代码,即使在那时不仅dynamic_cast会更多适当的,但是可以合理地探索你的类是否没有足够的共同点来为它们提供更完整的通用接口。
否则,请考虑提供一个自定义容器类,其中包含适当类型的数据成员,以容纳您需要放入其中的所有不同类的实例。