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

标签 c++ templates observer-pattern virtual-functions

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

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/

相关文章:

c++ - 如何使对话框外的桌面上的Win32 EDIT窗口占用所有空间

c++ - 如何进行一维 "valid"卷积?

c++ - 堆栈上的对象意外被删除

C++11 观察者模式(信号、槽、事件、改变广播器/监听器,或任何你想调用它的东西)

C++:链接时gcc找不到静态成员

c++ - 改变成员 vector 的类型

c++ - 如何使用模板表达成员之间的约束?

c++ - 将 "this"动态转换为返回值是否可以?

oop - 观察者模式的反面是什么?

c++ - 如何将信号和槽用于观察者模式?