C++ 您可以使用boost::shared_ptr作为映射的键吗?

C++ 您可以使用boost::shared_ptr作为映射的键吗?,c++,shared-ptr,stdmap,C++,Shared Ptr,Stdmap,我可能需要重新思考一下我的总体设计,但目前看来,我可能想做以下事情: class A; class B; std::map<boost::shared_ptr<const A>, B> APtrToBMap; A类; 乙级;; std::map APtrToBMap; 我已经试过了,它似乎在一个简单的情况下工作(编译器没有抱怨,简单的测试似乎工作)。但我对这种方法有了新的想法。我怀疑里面有一些我不知道的陷阱 那么,上述观点在实际意义上是否有效?或者,当我这样做时,是

我可能需要重新思考一下我的总体设计,但目前看来,我可能想做以下事情:

class A; 
class B;
std::map<boost::shared_ptr<const A>, B> APtrToBMap;
A类;
乙级;;
std::map APtrToBMap;
我已经试过了,它似乎在一个简单的情况下工作(编译器没有抱怨,简单的测试似乎工作)。但我对这种方法有了新的想法。我怀疑里面有一些我不知道的陷阱


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

参考文献中有这样一句话:

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

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

是的,您可以使用共享指针作为std::map的键,但这肯定是设计失败的迹象。它将根据一些随机内存位置进行排序


你的问题有点含糊。如果您说您将如何使用该映射以及您试图归档的内容,您可能会得到更有用的答案。

如果您将该映射与boost::python结合使用,请小心!
C++中基于SypDypPTR对象比较的所有操作可能失败,如果您从Python

传递那些SysDypPTR对象,我很高兴您找到了这个。我在快速浏览标题的基础上得出了相反的结论,但这是基于我自己有缺陷的分析。但是为什么要使用共享的ptr作为容器中的密钥呢?谢谢你的回答和澄清。正如我所怀疑的,我需要重新审视我的方法。在我的情况下,我一直在寻找一种简单的方法来跟踪共享的ptr和“B”,但这不起作用。@davka:这样你就可以将共享的ptr放入
集中
。但这样一来,地图就不会阻止共享的ptr自毁。如果你要把共享的ptr本身放到地图中,那么你可以在地图中找到对ptr的唯一引用。我不明白…他只是想要一个指向B对象指针的地图,所以我说如果他出于某种原因害怕使用共享ptr,他可以使用指针本身。或者你的意思是在地图中有一个共享ptr的副本,它可以防止对象被删除?你可以这样做,而不必存储原始指针。您可以存储共享指针并覆盖映射的比较运算符。具有随机顺序的映射对于快速查找与对象关联但不是对象一部分的数据仍然很有用。我不会对一个坏的设计下结论。@Mark,你能举个例子吗?如果贴图的键是指针,那么为什么贴图的值不是对象的一部分?效果是一样的。如果您想搜索基于特定对象的数据,该怎么办?我已经多次使用这种方法将数据附加到UI列表中的项目中,比如API没有提供合理的方法时。@Noah然后编写一个包装器。通过这样做,您还可以简化代码的单元测试,因为您可以用模拟对象替换对象。@Sam,仅仅因为您还没有发现问题并不意味着它不存在。我认为这是一个好主意,询问像这样的非标准用法的潜在问题。谢谢大家的回答。正如你们中的一些人所指出的,这主要是一个糟糕设计的症状;我试图在错误的地方解决问题。从那以后,我重新审视了我的设计,不再需要做我所质疑的糟糕的地图。关于为什么这是一个坏主意的回答也很有启发性;我心里明白,它不会像我想做的那样;直到现在我才明白为什么。(事实上,我试图做的与我上面模板化的地图不匹配)