1

我遇到了Xeo的一种较旧的思考类型擦除技术,我开始想知道,应该如何修改该代码以使其与and一起使用。std::unique_ptr'ersstd::shared_ptr'ers

帖子中的代码可以在这里找到。如果输入包含的内容unique_ptrs并且其中的数据shared_ptr'ers变成垃圾,则代码将无法编译。我尝试的是从模板化基类继承的类,所以它也可能有点复杂。现在,这主要是出于好奇,因为我开始怀疑这是否会很困难(在一般情况下),因为这在存储复杂对象时会变得很方便,例如,std::vectorBoost.Any不可用时。

编辑:我注意到在测试时我的代码中有一个错误,代码可以正常工作shared_ptr'ers(内容不是垃圾),虽然不是unique_ptr'ers. 然后,为什么不将这种类型的新实例Any_Virtual(如 Xeo 提供的代码)存储到std::unique_ptr'ers.

我想那么问题将是:

  1. 如何修改它Any_Virtual以便它可以使用std::unique_ptr
  2. 哪个设计更好,一个std::vector<Any_Virtual>对象,Any_Virtual一个智能指针在哪里,还是一个std::vector<std::unique_ptr<Any_Virtual>>对象?或者它甚至重要吗?
4

1 回答 1

3

当您使用类型擦除时,类型必须满足一组要求才能与类型擦除容器兼容:这组称为模型。特别是,holder<T>::clone复制的成员*this反过来要求held_(类型T,被擦除的类型)是可复制构造的。因此,您的类型擦除类的模型是可复制构造的。

但是,包含 an 的类型std::unique_ptr将不能开箱即用地复制构造。

如果不知道您想要实现什么,就没有明显的解决方法。也许您真的希望模型不那么严格,例如它可能只需要可移动构造(包含 an 的类型std::unique_ptr可以很容易地实现,开箱即用)。或者也许你真的希望那些确实持有std::unique_ptrs 的类型是可复制构造的。

在我看来,你可以用类型擦除做的最糟糕的事情是妥协,并有条件地对模型进行操作,这取决于被擦除的类型本身是否支持这样的操作。在这里,这意味着如果复制一个Any_Virtual值碰巧包含一个不可复制构造的擦除类型的值,则会导致异常。

也许更令人担忧的是,您大量获得垃圾std::shared_ptrs 的事实表明您的实现Any_Virtual或使用它存在问题。您绝对不应该假设单独使用std::shared_ptrAny_Virtual单独使用有问题,但使用任何Any_Virtual. 由于我没有注意到实现中的问题(但我很容易忽略了一些东西),我想看一个展示问题的程序示例。

于 2012-08-18T17:03:53.273 回答