C ++从含有可变参数模板的闭包的std :: vector中删除元素

时间:2014-11-04 12:55:45

标签: c++11 vector lambda closures

我有一个基于此处显示的代码的类: 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;

1 个答案:

答案 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,这会有所帮助。