我目前有一个std::function
std::function
代表一个类似观察者模式的侦听器集合。已选择std::function
以便可以订阅任何类型的侦听器,例如函数指针,lambdas或类函子。
那就是说,我想取消订阅听众,但我意识到operator==
没有在两个std::function
对象之间定义{{1}}。
有什么想法吗?代码可以完全改变。
答案 0 :(得分:4)
为每个听众使用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();