我有一个基于此处显示的代码的类: http://geekswithblogs.net/raccoon_tim/archive/2011/09/28/lambdas-and-events-in-c.aspx
不同之处在于我使用可变参数模板。
它运行良好,但我无法从向量中删除回调,因为我无法找到它。
要么我得到一个错误,要么我得到一些奇怪的值,我无法比较找到该元素。
不能工作的代码是:
for (auto i = this->handler.begin(); i != this->handler.end(); i++) {
if ((*i).target<void(Args...)>() == f.target<void(Args...)>()) {
this->handler.erase(i);
break;
}
}
我搜索了很多,但我无法找到适用于此案例的任何内容。例如,std :: find在我的情况下不起作用。
感谢任何帮助。
希伯林
编辑: 据我所知,std :: function不支持==和!=的主要问题是原因。有办法解决这个问题吗?是不是有一种识别lambda的方法,所以我再次将它删除?我的意思是,至少它在记忆中有一个位置。 .target_type()是我试图找到的另一种方法,但是它会引发一些&#34;尝试引用已删除的函数&#34;
答案 0 :(得分:1)
试试这个:if ((*i).template target<void (T1)>() == f.template target<void (T1)>())
参见(可能包括其中)this question
这应该使它编译和工作 - 有点。
删除函数,lamdbas,其他callables是一种棘手的问题。
void(T1)
无法正常工作,并且会在比较的两边始终返回nullptr
。
void(*)(T1)
绑定的内容是免费功能,则 operator +=
将起作用。但是,它不会为成员函数或lambda工作。
即使你找到了一种唯一识别Callable的方法(我也不知道,像storing the typeid().name() and combining it with a its address?那样愚蠢的东西),你仍然需要将它存储在某个地方以便能够进行调用以删除它
将来,如果你真的提供了你所获得的代码和错误,最好是Short, Self Contained, Correct (Compilable), Example,例如a place like this,这会有所帮助。