函数如何要求其调用者 class 调用其方法之一?

How can a function ask its caller class to invoke one of its methods?

我的情况是这样的:

class Callee {
public:
  void request();
};

class Caller {
  void call() {
    Callee{}.request();
  }
  void invoke1(); // the implementation doesn't matter
  void invoke2(); // the implementation doesn't matter
  // more invoke()s
};

我希望 Callee::request() 根据可以在 Callee::request()Caller::call() 中计算的上下文请求调用 Caller::invoke() 成员函数之一:

void Callee::request() {
  // do stuff
  switch (context) {
    // request one of the invoke()s to be run immediately
  }
  // do more stuff
}

哪些解决方案比较优雅?我不想(从最重要到最不重要):

如果 Callee::request()Caller 收到一些参数就可以了。

您可以通过多种方式实现这一目标。

  • 最直接的就是Callee::request() return一个 enum 值,Caller 然后对其执行 switch 并调用 适当的功能。这意味着呼叫者和被呼叫者将有 都知道这个 enum.

  • 另一种方式也很简单,不过 稍微复杂一点,就是从 被调用者的调用者接受 enum 值作为参数, 这样通过调用此函数,被调用方可以向调用方指示 它想要做什么。同样,调用者可以 switch 该值,并且 调用 invoke1()invoke2() 或者你有什么。

  • 另一种方法是定义一个接口,(一个class只包含 纯虚方法),其中包含 invoke1()invoke2() 让调用者实现该接口,并传递该接口 本身给被调用者,以便被调用者可以决定哪个函数 称呼。在这种情况下,呼叫者和被呼叫者都需要拥有 了解这个新界面。

  • 另一种方法是将两个函数指针传递给被调用者,这样 被叫方可以决定调用哪一个。被调用者这样 不需要知道任何东西,但它的扩展性不是很好,因为 如果你有 50 个不同的函数怎么办?