Функция слабого связывания? Зная, когда срок действия weak_ptr истек? - PullRequest
0 голосов
/ 11 октября 2019

Мне нужна помощь и объяснения, пожалуйста, я немного запутался: (

У меня есть «слабый» менеджер, который содержит weak_ptr других объектов в моей программе. Я хотел бызнать, когда срок действия weak_ptr истекает в момент истечения срока его действия (т. е. shared_ptr, на который он указывает, разрушает элемент).

Я просматривал некоторые паутины о привязке weak_ptr, но янемного запутался во всем, поэтому любая помощь будет оценена. Я наткнулся на этот ответ (h ttps: //stackoverflow.com/questions/11680680/binding-to-a-weak-ptr), но неЯ не очень понимаю, так как я мало что сделал с std::bind. Как это работает с weak_ptr? Если я связываю с ним функцию, вызывается ли функция каждый раз, когда что-то происходит со слабым_птром?

По сути, у меня есть что-то вроде этого:

#include <iostream>
#include <list>
#include <memory>
#include <functional>
#include <algorithm>

struct Obj {};

class weakManager
{
public:
    unsigned int addItem(std::shared_ptr<Obj>& item)
    {
        items_.push_back(std::weak_ptr<Obj>(item));
        return items_.size() - 1;
    }

    void addObserver(std::function<void(unsigned int ID)> observer)
    {
        obsevers_.push_back(observer);
    }

    unsigned int getValidItems()
    {
        unsigned int validItems = 0;
        std::for_each(items_.begin(), items_.end(), [&validItems](std::weak_ptr<Obj>& item) 
            {
                if (!item.expired())
                    ++validItems;
            });
        return validItems;
    }

private:
    std::list<std::weak_ptr<Obj>> items_;
    std::list<std::function<void(unsigned int ID)>> obsevers_;
};


int main(int argc, const char * argv[]) 
{
    weakManager manager;

    manager.addObserver([](unsigned int ID) 
        {
            std::cout << "Observer says, item " << ID << " expired...\n";
        });

    {
        std::shared_ptr<Obj> someItem(new Obj);
        std::cout << "Item with ID : " << manager.addItem(someItem) << " added.\n";

        std::cout << "Manager has " << manager.getValidItems() << " valid item(s).\n";
    }
    std::cout << "Manager has " << manager.getValidItems() << " valid item(s).\n";

    return 0;
}

В настоящее время я должен вручную проверить, какие элементы в менеджере не устарели. Я хотел бы иметь возможность вызвать обратный вызов «наблюдателя», когдапредмет уничтожается (т.е. weak_ptr истекает без ручного вызова getValidItems.

Любая помощь будет оценена. Большое спасибо.

...