其他分享
首页 > 其他分享> > c – 检查shared_ptr的容器是否包含指针?

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

作者:互联网

使用Observer模式.我有一个名为Monitor的类,它正在监视一组对象.该类是一个Observer,它的集合中的每个对象都是一个Subject.目前,该集合是作为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)

UPDATE

我应该补充说,我意识到我可以在容器上使用for循环,但我想知道是否有一种更加流畅的方式.

更新2

SomeSharedPointer是std :: shared_ptr< SomeType>的typedef.其中SomeType派生自抽象类Subject(标准Observer模式实现). 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,observer-pattern
来源: https://codeday.me/bug/20190826/1732626.html