gpt4 book ai didi

c++ - 编写可以处理隐式共享但对不可复制类型(如 unique_ptr)关闭它的容器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:37 24 4
gpt4 key购买 nike

我找到了一个旧的 Grid 类,它只是一个使用类型模板化的简单二维容器。要制作一个你会这样做:

Grid<SomeType> myGrid (QSize (width, height));

我试着让它成为“Qt-ish”...例如,它根据 QSize 进行大小操作,然后您使用 myGrid[QPoint (x, y )]。它可以采用 bool 掩码并对设置了掩码位的元素进行操作。还有一个专门化,如果您的元素是 QColor,它可以为您生成一个 QImage

但我采用的一个主要 Qt 习惯用法是它确实 implicit sharing在引擎盖下。这在 Thinker-Qt 的基于 QColor 的网格中非常有用。 - 基于程序我有。

但是 :-/我也碰巧遇到过一些我写过这样的案例:

Grid< auto_ptr<SomeType> > myAutoPtrGrid (QSize (width, height));

当我从 auto_ptr 升级到 C++11 的 unique_ptr 时,编译器有理由提示。隐式共享需要在需要时制作相同拷贝的能力……而 auto_ptr 通过将复制与所有权转移混为一谈,从而掩盖了这个错误。不可复制类型和隐式共享根本无法混合,unique_ptr 很友好地告诉我们。

(注意:碰巧我在实践中没有注意到这个问题,因为 auto_ptr 的用例是通过引用传递网格...从不通过值传递。仍然,这是糟糕的代码……而 C++11 的主动性是在潜在问题发生之前指出它。)

好的,那么...我该如何设计一个可以打开和关闭隐式共享的通用容器?当我使用 auto_ptr 时,我确实想要许多 Grid 功能,如果对不可复制的类型禁用复制,那就太好了……这会捕获错误!但是,当类型恰好是可复制时,默认情况下隐式共享工作很好。

一些想法:

  • 我可以创建单独的类型(NonCopyableGridCopyableGrid)...或(UniqueGridGrid)取决于你的口味...
  • 我可以将一个标志传递给 Grid 构造函数
  • 我可以使用静态工厂方法(Grid::newNonCopyableGrid::newCopyable),但它会在后台调用相关的构造函数...可能更具描述性
  • 如果可能,我可能会“检测”包含类型的可复制性,然后利用 QSharedDataPointer是否实现,取决于?

有什么充分的理由选择其中一种方法而不是其他方法,或者人们是否针对这种情况采用了更好的方法?

最佳答案

如果您打算在单个容器中执行此操作,我认为最简单的方法是使用 std::is_copy_constructable 来选择您的数据结构是否继承自 QSharedData,并将 QSharedDataPointer 替换为 std::unique_ptr (QScopedPointer 不支持移动语义)

这只是我的想法的粗略示例,因为我没有同时使用 Qt 和 C++11:

template<class T>
class Grid
{
struct EmptyStruct
{
};

typedef typename std::conditional<
std::is_copy_constructible<T>::value,
QSharedData,
EmptyStruct
>::type GridDataBase;

struct GridData : public GridDataBase
{
// data goes here
};

typedef typename std::conditional<
std::is_copy_constructible<T>::value,
QSharedDataPointer<GridData>,
std::unique_ptr<GridData>
>::type GridDataPointer;

public:
Grid() : data_(new GridData) {}

private:
GridDataPointer data_;
};

关于c++ - 编写可以处理隐式共享但对不可复制类型(如 unique_ptr)关闭它的容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11094351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com