我挖出了一个旧Grid
类,它只是一个以类型为模板的简单二维容器。要制作一个,您可以这样做:
Grid<SomeType> myGrid (QSize (width, height));
我试图将其设为“Qt-ish”...例如,它根据 进行大小操作QSize
,并且您使用myGrid[QPoint (x, y)]
. 它可以采用布尔掩码并对设置了掩码位的元素进行操作。还有一个专业化,如果你的元素是QColor
它可以为你生成一个QImage
。
但我采用的一个主要 Qt 习惯用法是它在后台进行了隐式共享。事实证明,这在我拥有的基于Thinker-Qt的程序的基于 QColor 的网格中非常有用。
但是:-/ 我也碰巧遇到过一些我写过以下内容的情况:
Grid< auto_ptr<SomeType> > myAutoPtrGrid (QSize (width, height));
当我从auto_ptr
C++11's升级时unique_ptr
,编译器理所当然地抱怨。隐式共享需要能够在需要时制作相同的副本……并且auto_ptr
通过将复制与所有权转让混为一谈,从而消除了这个错误。不可复制类型和隐式共享根本不混合,并且unique_ptr
很友好地告诉我们。
(注意:碰巧我在实践中没有注意到这个问题,因为 的用例auto_ptr
是通过引用传递网格......从不通过值。不过,这是糟糕的代码......以及 C 的主动性++11 在潜在问题发生之前指出了它。)
好的,那么...我如何设计一个可以打开和关闭隐式共享的通用容器?当我使用 Grid 时,我确实需要许多 Grid 功能,auto_ptr
如果对不可复制的类型禁用复制,那就太好了……这会捕获错误!但是,当类型恰好是可复制的时,默认情况下具有隐式共享工作是很好的。
一些想法:
- 我可以根据您的口味制作单独的类型 (
NonCopyableGrid
,CopyableGrid
)...或 (UniqueGrid
, )...Grid
- 我可以将标志传递给
Grid
构造函数 - 我可以使用静态工厂方法(
Grid::newNonCopyable
,Grid::newCopyable
),但它会在后台调用相关的构造函数......也许更具描述性 - 如果可能,我可能会“检测”包含类型的可复制性,然后在实现中利用QSharedDataPointer或不利用,这取决于?
有什么好的理由选择其中一种方法而不是其他方法,或者人们是否针对这种情况采用了更好的方法?