繁体   English   中英

std :: vector包含原子的类

[英]std::vector of class containing atomic

我正在尝试创建一个包含类实例的向量,该类继而包含(除其他外)std :: atomic。

我尝试了几种:

  • 如果未指定复制构造函数,则编译器将给出有关删除该构造函数的错误。

如果指定了副本构造函数,我将尝试两件事:

  • 与foo(foo&other)一起,它将抱怨找不到foo的副本构造函数。

    编辑:副本构造函数是foo(foo&other):atomic(other.atomic.load()){}

  • 与foo(const foo&other)一起使用时,它将抱怨std :: atomic没有const复制构造函数。

    编辑:副本构造函数是foo(const foo&other):atomic(other.atomic.load()){}

我完全不知道如何解决此问题,因此非常感谢您的帮助

根据设计, std::atomic既不可复制也不可移动。 导致std::vector重新分配的操作要求其元素至少是可移动的。 因此,您有以下选择:

  • 停止在元素类中存储std::atomic 也许可以使用std::unique_ptr<std::atomic>代替。
  • 停止将元素类直接存储在向量中,而是存储std::unique_ptr<ElementClass> (如@Richard Critten在评论中所建议)。
  • 为您的类编写一个副本或移动构造函数和赋值运算符,这将以某种方式解决std::atomic的不可移动性。
  • 给您的类虚拟复制/移动操作,以使编译器满意。 然后,使用reserve预先在vector中分配空间,然后仅使用附加元素(最大为预先分配的大小),访问它们或从末尾删除的函数; 没有中间插入或删除。 这样,虚拟操作将不会真正被调用。

    考虑到这种方法的脆弱性,我建议采取两种预防措施:

    1. 放置假人,以便您尽快发现违反“不调整大小”要求的情况。
    2. 不要直接使用std::vector ,而是将其包装在具有适当限制的接口的自己的NonResizableVector<T> ,并对其进行大量记录。

您应该(甚至可以使用)其中哪一个取决于您的类实际执行的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM