c++ - 如何识别容器中的 std::function 并将其删除?

标签 c++ std-function

我目前有一个 std::vectorstd::function,它表示类似观察者模式的一组监听器。 std::function 已被选中,因此可以订阅任何类型的监听器,例如函数指针、lambda 或类仿函数。

也就是说,我想取消订阅一个监听器,但我意识到 std::function 没有在两个 std::之间定义 operator==函数对象。

有什么想法吗?代码可以完全改变。

最佳答案

为每个监听器使用一个 ID。

using ID = int;

ID listener1 = subject.subscribe([](){/* some code */});

/* some more code */

subject.unsubscribe(listener1);

或者,您可以使用一个类进行订阅,而不是自行取消订阅。它包含 ID 和主题。

class Subscription {
    ID id;
    Subject subject;

public:
    Subscription(ID id, Subject subject) : id(id), subject(subject) {}
    void unsubscribe() {
        subject.unsubscribe(id);
    }
};

Subscription listener1 = subject.subscribe([](){/* some code */});

/* some more code */

listener1.unsubscribe();

关于c++ - 如何识别容器中的 std::function 并将其删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50831570/

相关文章:

c++ - 堆栈变量生命周期好奇的例子

c++ - 在 .cpp 文件中实现时访问私有(private)成员

c++ - 如何从实际函数中推导出 `std::function` 参数?

c++ - 为什么使用与父一起声明的 std::function 在与 child 一起使用时会显示错误?

c++ - 是否可以从 std::bind 对象访问参数?

c++ - 为什么一个类需要移动操作来绑定(bind)到一个 std::function ,该函数具有该类按值传递的签名?

c++ - 加速 C++ 练习 11-6

c++ - 指针字段在 C++ 中的行为不符合预期

c++ - clang - shared_ptr 无法运行其删除程序

c# - 传递一个成员函数,如 C++ 中的 std::function(如 C# 中)