【发布时间】:2018-01-18 18:14:20
【问题描述】:
我有一个弱指针向量,如果指针仍然存在,我想遍历该列表并执行一个函数。如果指针消失了,我想将其移除。
class my_class
{
public:
std::shared_ptr<my_class> pointer_t;
std::weak_ptr<my_class> weak_pointer_t;
...
private:
...
};
class listeners_class
{
public:
typedef std::vector<my_class::weak_ptr> listeners_t;
...
private:
listeners_t f_listeners;
...
};
我注意到我可以直接在remove_if() 测试函数中实现它,因为remove_if() 实际上循环遍历整个向量并尝试锁定弱指针。另外,这种方式更原子。
有 lambda 的代码。
f_listeners.erase(
std::remove_if(
f_listeners.begin()
, f_listeners.end()
, [&ptr](my_class::weak_pointer_t l)
{
my_class::pointer_t ll(l.lock());
if(ll == nullptr)
{
return true;
}
ll->some_callback(ptr); // <<-- side effect!
return false;
})
);
我认为这是不好的做法,但想确认是否有关于此类代码的标准形式。
【问题讨论】:
-
这里的目标是删除失去目标的弱指针吗?
-
是的。两个目标:如果指针仍然存在,则调用
some_callback(),否则从向量中删除指针。 -
我认为这里的一般期望是只要您不直接修改您正在迭代的容器,这会使迭代器无效,并且
some_callback不使用ptr在立即同步块之外,那么你应该没问题。这里有很多警告。 -
如果我写它,我会通过两次。第一遍(上图)删除了所有“过期”的弱指针。第二遍调用所有剩余的
some_callback(可以使用for_each完成) -
@MarshallClow 这个问题的重点似乎是避免两次通过。但是,可能必须证明它有所作为
标签: c++ language-lawyer stl-algorithm side-effects