【问题标题】:C++ Remove element from std::vector containing closures with variadic templatesC++ 从包含带有可变参数模板的闭包的 std::vector 中删除元素
【发布时间】:2014-11-04 12:55:45
【问题描述】:

我有一个基于此处显示的代码的类: 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() 是我试图找出的另一种方法,但它会导致一些“尝试引用已删除的函数”

【问题讨论】:

    标签: c++11 vector lambda closures


    【解决方案1】:

    试试这个:if ((*i).template target&lt;void (T1)&gt;() == f.template target&lt;void (T1)&gt;())

    请参阅(可能还有其他)this question

    这应该使它可以编译和工作 - 有点。 删除函数、lamdbas 和其他可调用对象有点棘手。 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 中。

    【讨论】:

    • 我认为 2) 可以解决问题:(*i).template target&lt;void (Ts...)&gt;() == f.template target&lt;void (Ts...)&gt;()
    • @Banan 你说得对,我误读了std::function::target 上的文档,它需要一个T,并返回一个T*
    • 嗯...在做了更多测试后,我认为您的第一点也是有效的。
    • @Banan 好吧,我猜对了一半。 void(T1) 将始终返回 nullptr,但 void(*)(T1) 仅适用于实际函数,并且不会将 lambda 与 operator() 匹配...
    • 好的。我从来不知道.template。由于可变参数模板参数,我对您的代码进行了一些修改。 pastebin.com/EpCY9dmJ 编译但执行时崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    相关资源
    最近更新 更多