我基本上是在尝试实现一个通用的观察者模式。
class Observer {
public:
template <class T>
virtual void OnEvent(const EventHandle& h, T& affectedItem) = 0;
};
class Subject {
public:
void AddObserver(Observer* o) {
observers.Add(o);
}
void RemoveObserver(Observer* o) {
observers.Remove(o);
}
template <class T>
void Notify(const EventHandle& h, T& affectedItem) {
for (Observer* o : observers) {
o->OnEvent(h, affectedItem);
}
}
private:
set<Observer*> observers;
};
在 Observer::OnEvent()
中,我想获取在事件中受到影响的项目(比如我刚刚向库存添加了一些东西并且需要在GUI——我会调用 Subject::Notify(itemAddedEvent, newItem)
)。我知道我需要对类进行一些重构/重新设计,但我不知道如何做。有哪些方法可以解决这个问题?
最佳答案
不幸的是,正如您在编译时可能已经看到的那样,不允许使用虚函数模板。
由于您选择了虚函数,我猜您打算以某种方式使用多态性。如果是这种情况,您可以使用 inheritance 完美地使用 tempalteless 实现。唯一的限制是您的不同参与者继承自您的通用类。但由于可能的多重继承,他并不是一个强约束。
观察者可能看起来像(我对受影响的项目使用 Subject,但你可以使用第三类):
class Subject;
class Observer {
public:
virtual void OnEvent(const EventHandle& h, Subject& affectedItem) = 0;
virtual ~Observer() {} // virtual function ? => better foresee a virtual destructor
};
obervee 几乎保持不变:
class Subject {
public:
...
void Notify(const EventHandle& h, Subject& affectedItem) {
for (Observer* o : observers) {
o->OnEvent(h, affectedItem);
}
}
private:
set<Observer*> observers;
};
using 类将是这样的:
struct ConcreteObserverA : Observer {
void OnEvent(const EventHandle& h, Subject& affectedItem) override {
cout<<"A:"<<&affectedItem<<endl;
}
struct ConcreteSubjectSA : Subject { };
这里是live demo .
关于c++ - 绕过事件的模板化虚函数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32233561/