是否有一种载体可以容纳任何 POD?像这样的东西:
anyvector v;
v.push_back<int>(1);
v.push_back<somestruct>({1, 2, 3});
并通过以下方式访问它:
int a = v.get<int>(0);
somestruct b = v.get<somestruct>(1);
我知道保存每个元素的偏移量肯定有开销,但应该小于vector<boost::any>
的开销这是我目前的解决方案。
我需要的操作是插入到末尾,从末尾移除和随机访问。
我知道实现一个不是问题,只是问是否有现成的。
编辑:使用指针存储数据(boost::any
、boost::variant
)的解决方案比使用线性存储的开销大,这正是我正在寻找的。p>
最佳答案
我从没听说过,如果有的话我会很惊讶,因为
非常特别。但是,实现起来应该不会太难,
使用两个 vector ,一个 std::vector<unsigned char>
对于原始内存
你放东西的地方,和std::vector<size_t>
映射索引。
只要它只包含 POD,您就可以使用 memcpy
插入
元素。只是不要忘记尊重对齐。那指数
数组映射索引:不要尝试将指针放入其中,因为它们会
以后被无效push_back
.
就此而言,实现一个拥有
任何类型,甚至是非 POD,使用 placement new 和显式销毁。
唯一真正的问题是对齐。当你插入
vector,你还必须保存一个多态析构函数的实例
类型。这可能有点棘手,但是是可行的,至少在
实践。基本上,您会复制 boost::any
的内容确实,但是
而不是指向动态内存的指针,你会得到“动态内存”
来自第二个数组。
关于c++ - 可以容纳任何 POD 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9738069/