13

我可能需要重新考虑我的整体设计,但就目前而言,看起来我可能想做一些类似的事情:

class A; 
class B;
std::map<boost::shared_ptr<const A>, B> APtrToBMap;

我试过这个,它似乎在一个简单的情况下工作(编译器没有抱怨,简单的测试似乎工作)。但我对这种方法有了第二个想法。我怀疑那里有一些我不知道的陷阱。

那么,上述内容在实际意义上是否有效?或者当我这样做时是否有一些我不知道的缺陷?

4

4 回答 4

24

参考有这样的说法:

template<class T, class U>
  bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws

返回: 一个未指定的值,使得

  • operator< 是严格的弱排序,如 C++ 标准的第 25.3 节 [lib.alg.sorting] 中所述;
  • 在 operator<, !(a < b) && !(b < a) 定义的等价关系下,两个 shared_ptr 实例是等价的当且仅当它们共享所有权或都是空的。

抛出:什么都没有。

注意:允许将 shared_ptr 对象用作关联容器中的键。

于 2010-11-10T15:27:53.880 回答
4

是的,您可以使用共享指针作为 std::map 的键,但这是设计损坏的明确标志。它将根据一些随机内存位置进行排序。

你的问题有点含糊。如果您说您将如何使用该地图以及您要归档什么,您可能会得到更有用的答案。

于 2010-11-10T16:40:06.017 回答
0

我不是 100% 熟悉共享指针,但如果有办法访问原始指针,您可以使用它作为键(如果您仍然出于某种原因担心)。

于 2010-11-10T16:24:01.250 回答
0

如果您将它与 boost::python 一起使用,请小心!如果您从 Python 传入这些 shared_ptr 对象,则 C++ 中基于比较 shared_ptr 对象的所有操作都可能会失败

于 2012-11-28T08:42:38.203 回答