【发布时间】:2020-07-11 23:36:11
【问题描述】:
我的情况是这样的:
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() 请求调用Caller::invoke() 成员函数之一,具体取决于可以在Callee::request() 或Caller::call() 中计算的上下文:
void Callee::request() {
// do stuff
switch (context) {
// request one of the invoke()s to be run immediately
}
// do more stuff
}
哪种解决方案比较优雅?我不想要(从最重要到最不重要):
-
Callee了解Caller的定义; - 使用模板;
-
Callee知道Caller的声明; -
Caller自行选择invoke();
如果Callee::request() 接收到来自Caller 的一些参数就可以了。
【问题讨论】:
-
将上下文传递给
request -
如果所有调用函数都具有相同的签名,您可以将适当的
std::function对象传递给Callee::request。 -
您有相互矛盾的要求:如果 Callee 不知道 Caller 方法,它如何选择调用哪个方法?请澄清一下,您是否希望仅根据索引号或什么来进行调用?还是我误解了Callee可以选择的要求?
-
没有什么好的方法可以满足您的所有要求。如果您不想使用模板,那么您可以使用
Caller的抽象基类Callee类需要知道的。模板并将Caller对象传递给request函数对我来说似乎是最简单的解决方案。 -
阿什瓦尼是正确的。您可以将
[this](){this->invoke1();}存储在std::function<void()>中。如果您不认识表格,那是一个 lambda。它捕获this。
标签: c++ function class member design-decisions