我有一些中间件使用的二进制数据向量
std::vector<uint> data
此向量内的数据基本上映射到类Foo
上:
|uint|uint|uint|uint|uint|uint|uint|uint|uint|
| F o o | F o o | F o o |
使用自定义放置分配器(如此处Can I use an std::vector as a facade for a pre-allocated (raw) array?所述),我现在可以将第一个向量的内存映射到类型为std::vector<Foo>
的向量
但是,如果我对第二个向量进行运算,则第一个向量的大小不会更新。
另一种方法是将第一个向量std::vector<uint8>
封装在行为类似于std::vector<Foo>
的自定义容器中,但这需要很多工作(我不能使用Boost)。
有什么好主意的想法吗?
答案 0 :(得分:0)
情况与链接的问题完全不同。您无需处理预分配的存储,而已有对象的数据。此外,您希望双方都可以修改矢量,或者换句话说,他们拥有共享所有权。
这不是小事。您可以提供一个“视图类”,该“视图类”在同一向量上提供另一组操作,或者让一组自由函数执行相同的操作。无论哪种方式,它们都必须具有引用语义。
免费功能示例
template<typename T>
void push_back_foo(std::vector<uint8_t>& vec, T&& t)
{
auto it = vec.insert(vec.end(), sizeof(Foo), {});
new (&*it) Foo{std::forward<T>(t)};
}
对于所有其他功能,依此类推。它们将Foo
端的操作映射到uint8_t
端的操作。
一个旁注:对结果向量进行指针算术是形式上未定义的行为,因为那里没有Foo
的数组。在处理带有立面的二进制数据时,通常可以理解,编译器不会烧毁您的房屋,并且此类形式会被忽略。