C++03中返回类似于`std::auto_ptr`集合的最佳方式是什么?

7

std::auto_ptr不允许存储在STL容器中,例如std::vector。然而,有时候我需要返回一组多态对象,因此我不能返回对象的向量(由于切片问题)。我可以使用std::tr1::shared_ptr并将其放入vector中,但是这样我就必须付出维护单独引用计数的高昂代价,而拥有实际内存的对象(容器)不再逻辑上“拥有”这些对象,因为它们可以被复制出来而不考虑所有权。

C++0x以std::vector<std::unique_ptr<t>>的形式提供了完美的解决方案,但我无法访问C++0x。

其他注意事项:

  • 我无法访问C++0x,但我可以使用TR1。
  • 我想避免使用Boost(尽管如果没有其他选择则可用)
  • 我知道boost::ptr_container容器(即boost::ptr_vector),但我想避免使用它,因为它会破坏调试器(内部存储在void *中,这意味着很难在调试器中查看实际存储在容器中的对象)

你是否考虑使用一个包含指向std::vector的指针的类作为公共成员,并仅实现构造函数、析构函数、复制、交换和赋值操作符? - Alexandre C.
@Alexandre C.:目前我还没有考虑太多——这是一个如此常见和普遍的问题,我想先看看别人是如何解决它的,然后再尝试自己去做。 - Billy ONeal
2
实际上并不常见。当使用多态对象的容器时,如果需要完整的向量接口,则使用boost::ptr_vector,或者在仅在内部使用集合时使用我提到的内容(尽管带有私有成员)。 - Alexandre C.
你尝试过使用共享指针的向量吗?它真的那么昂贵吗? - Fred Foo
@Iarsmans:1. 你读了问题吗?2. 我关心的不是计算成本,而是所有权违规。 - Billy ONeal
1个回答

3
我会封装一个本地堆数组。你可以定义支持向量接口子集,而无需要求可复制性。

2
你可以实现自己的 std::vector,以满足所需的语义要求。 - Billy ONeal
@Billy:是的。当然,如果您知道own::vector将在哪种确切的上下文中使用,那么您可以实现绝对最少量的代码,使其在这样的上下文中生存。 - Puppy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接