gpt4 book ai didi

c++ - 绕过事件的模板化虚函数的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:59 26 4
gpt4 key购买 nike

我基本上是在尝试实现一个通用的观察者模式。

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com