c++ - 检查 shared_ptr 的容器是否包含指针?

标签 c++ observer-pattern shared-ptr

使用观察者模式。我有一个类,例如 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 支持 lambda,如果有算法解决方案需要的话)

更新

我应该补充一点,我知道我可以在容器上使用 for 循环,但我想知道是否有更时髦的方法。

更新 2

SomeSharedPointerstd::shared_ptr<SomeType> 的类型定义其中 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/

相关文章:

c++ - 将 Char* 分配给字符串变量后删除

C++ - 在返回对象之前删除它

ruby - 在 ruby​​ 方法上定义自定义回调

c++ - 初始化引用的 shared_ptr ( std::tr1::shared_ptr<class&> )

c++ - 2个相互连接的对象内部的共享指针

c++ - 这个静态断言能正常工作吗?

c++ - 可以在 C++ 中隐藏部分继承层次结构吗?

swift - 在 Swift 3 中使用 NSHashTable 实现观察者模式

java - 我可以将 WeakReference 传递给 Observable 监听器吗?

c++ - 带有 vector 的 shared_ptr