std::variant 中具有可变长度数组的结构

flu*_*ter 1 c++ arrays variant variable-length-array c++17

所以我正在使用带有可变长度数组成员的结构类型,如下所示:

struct Entry;

struct Data {
    int members;
    size_t entries_size;
    Entry entries[1];
};
Run Code Online (Sandbox Code Playgroud)

成员entries_size是数组的实际大小entires,只有从网络读取时才知道。问题是,我想在其他网络数据类型中使用它std::variant,如何将它放入std::variant整个数据对象的足迹中,而不会让悬空指针到处乱飞?

std::variant<Data, OtherData2, OhterData3...> v;
Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 6

这在 C++ 中是做不到的,C++ 在基本层面上根本不以这种方式工作。

在 C++ 中,所有对象都有已定义的类型和已定义的固定大小。您正在使用一种常见的类似 C 的方法来手动过度分配内存,以便Entry内存中可以在预计内存之后有额外的 s。

采取具体、严格、控制良好的步骤可以在不违反(大多数)“规则”的情况下完成此操作(但只是假设这Entry是微不足道的,当然,这还不清楚)。

然而,在混合中引入一个变体几乎是一个令人震惊的事情。A std::variant(当然)不是一个平凡的 POD。在为这种弗兰肯变体过度分配计算出的内存量后,可以使用新的放置来解决这个特殊的问题。

然而,一旦跨过这一障碍,下一个障碍就难以逾越:C++ 无论如何都无法保证变体的内部布局。毕竟,变体必须跟踪构造哪个变体值,并且所有这些的附加元数据可以出现在变体值的保留空间之前或之后。没有具体说明。游戏结束。