堆上的一个元素是否有一些 STL "container"?

Is there some STL "container" for one element on the heap?

我的问题:

类 仅包含 STL 容器可以使用 Rule of Zero,因此避免了手动编写 destructor/copies 等

我想知道是否有针对最简单的情况设计的 STL 工具(具有上述 属性):一个元素(在堆上)?


解释一下我们什么时候需要这个:

好吧,这个问题更多了 niche/hypothetical:我们有一个对象 Foo 有很多成员(n 成员)。 Foo 被移动复制了很多,以至于值得将其数据存储为单个堆对象(因此它可以只执行 1 而不是 n 浅拷贝)。它有时也会被深度复制。

我们可以通过使用 vector 和一个元素来解决这个问题:

class Foo
{
    struct Data
    {
        char gender;
        int age;
        std::string name;
        // lots of data
    };

    std::vector<Data> data;
    
public:

    Foo () : data(1) {}

    void Input (char c, int x, const std::string & str)
    {
        auto & d = data[0];
        
        d.gender = c;
        d.age = x;
        d.name = str;
    }

    void Print () const
    {
        auto & d = data[0];

        std::cout
            << d.gender << std::endl
            << d.age << std::endl
            << d.name << std::endl;
    }
};

demo

为了避免构造函数和所有那些 [0],我们可以 wrap the vector into its own class,但这感觉像是一个 hack - vector 对此有点过度杀戮并且可以容纳额外的内存( sizecapacity 如果编译器没有优化)。


请注意,unique_ptrshared_ptr 对此有不同的复制配置文件,因此在这里没有帮助(example). Also, this problem is similar to but not quite the same as pimpl,因为这里我们有一个定义的类型(使用 pimpl 我们甚至不能使用上面的 vector 技术)。

您可能正在寻找所谓的 deep/clone/copy/value 指针 (基本上是具有深度复制功能的唯一指针)。甚至还有一个提案,不知道它的实际状态:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3339.pdf.

AFAIK,到目前为止还没有被接受。也许,一些外部库提供了它(Boost?)。

相关问题: 在其接受的答案中,有一个 link 到某个库,它应该提供所需的功能。好像没维护了,不过应该还能用吧

您可以google获得更多解决方案。例如,您可以复制粘贴(并可能查看)此实现:https://vorbrodt.blog/2021/04/05/stddeep_ptr/.

相信大家在Code Reivew网站上也能找到一些解决办法,比如:DeepPtr: a deep-copying unique_ptr wrapper in C++。我认为使用 std::unique_ptr 并用深层复制功能包装它是个好主意。