使用观察者模式。例如,我有一个名为 Monitor 的类,它正在监视对象集合。该类是一个观察者,它的集合中的每个对象都是一个主题。目前该集合是作为 shared_ptr 的 std::list 实现的。在 Monitor 类的 Update 方法中,我想检查更新是否来自其集合中的对象之一。
std::list<SomeSharedPointer> items_;
...
void Monitor::Update(Subject *subject)
{
if(subject == something_)
{
DoSomething();
}
else if
??
// if subject is one of the objects in our collection then do something..
}
这里的主题是一个原始指针,我的集合是一个 shared_ptr 列表。如何有效地检查进入的主题是否是我收藏中的任何一个对象?
(请注意,我的编译器 msvc 支持 lambdas,如果有需要的算法解决方案)
更新
我应该补充一点,我意识到我可以在容器上使用 for 循环,但我想知道是否有更时髦的方法。
更新 2
SomeSharedPointer
是 std::shared_ptr<SomeType>
的 typedef,其中 SomeType
派生自抽象类 Subject
(标准观察者模式实现)。 SomeType 会在某个时候调用 Notify()
,它会为每个观察者调用 Update()
方法。 最佳答案
auto i = std::find_if(items_.begin(), items_.end(),
[=](const SomeSharedPointer& x) { return x.get() == subject; });
if (i != c.end())
{
// Object found, and i is an iterator pointing to it
}
一个小助手方法可以使这更具可读性:
typedef std::list<SomeSharedPtr> ObserverCollection;
// You can also add a const version if needed
ObserverCollection::iterator find_observer(Subject* s)
{
return std::find_if(items_.begin(), items_.end(),
[=](const SomeSharedPointer& x) { return x.get() == s; });
}
然后,如果您需要迭代器,您可以像这样使用它
auto i = find_observer(subject);
if (i != items_.end())
{
// Object found
}
或者如果你不这样做,就简单地像这样:
if (find_observer(subject) != items_.end())
{
...
}
关于c++ - 检查 shared_ptr 的容器是否包含指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8055549/