Мне нужна помощь и объяснения, пожалуйста, я немного запутался: (
У меня есть «слабый» менеджер, который содержит 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
.
Любая помощь будет оценена. Большое спасибо.