通过指针在实例上调用实现类型的函数

问题描述 投票:0回答:1

我正在尝试实现订阅者-发布者模式。我的基类

Subscriber
没有侦听器方法,而是声明类型
Handler
。这背后的想法是派生类将能够有多个处理程序来实现这种类型并可以传递给
Publisher
。我试图在
Notify
方法中调用一个处理程序,但我收到一个错误,指出
expression must have pointer-to-member type
。如何将我的函数指针转换为成员类型,我的方法是否可行?

class Subscriber {
public:
    typedef void (*Handler)();
};

struct Subscription {
    Subscriber *instance;
    Subscriber::Handler handler;
};

class Publisher {
private:
    std::vector<Subscription*> subscriptions;

public:
    virtual void AddSubscriber(Subscription *subscription) {
        this->subscriptions.push_back(subscription);
    };

    virtual void Notify() {
        for (auto subscription : this->subscriptions) {
            auto i = subscription->instance;
            auto h = subscription->handler;

            (i->*h)();
        }
    };
};
c++ function-pointers typedef pointer-to-member
1个回答
0
投票

1.也许你不需要订阅。像这样

class Subscriber {
public:
  typedef void (*Handler)();
  Handler handler;
};

2.你只需要在Notify()中调用handle()。像这样

virtual void Notify() {
  for (auto &subscriber : this->subscribers) {
    subscriber->handler();
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.