- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我理解解决方案的实现和双重分派(dispatch)/访问者模式,但是我不明白在编译时和运行时我们需要这种模式会发生什么。
例如这段代码:
#include <iostream>
class A {
public:
};
class B : public A {
};
class F {
public:
virtual inline void operator()(const A&) const noexcept {
std::cout << "FxA" << std::endl;
}
virtual inline void operator()(const B&) const noexcept {
std::cout << "FxB" << std::endl;
}
};
class G : public F {
public:
virtual inline void operator()(const A&) const noexcept {
std::cout << "GxA" << std::endl;
}
virtual inline void operator()(const B&) const noexcept {
std::cout << "GxB" << std::endl;
}
};
void by_const_ref(const F& f, const A& a) {
f(a);
}
int main() {
by_const_ref(F(), A());
by_const_ref(F(), B());
by_const_ref(G(), A());
by_const_ref(G(), B());
return 0;
}
如果没有双重分派(dispatch),对 by_const_ref 的第二次和第四次调用将不会将 B() 解析为 A 对象。
来自这篇文章:https://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_in_C++我知道它涉及名称修改和编译时间以及运行时的 vtable 解析,但我没有找到具体的方法。
对于名称修改部分,我查看了编译后的对象,但没有发现任何特殊之处。
对于 vtable,我用 g++ -fdump-lang-class 转储了它,看起来那里也没有太多信息。
因此我的请求。我想了解到底发生了什么,也许如何检查这种行为(使用像 nm 这样的工具,检查 vtable,机器代码?)
最佳答案
你说得太深了,它更简单。
C++ 虚函数根据单个 参数this
的类型启用动态调度。双重调度,顾名思义,就是根据两个参数的类型进行动态调度。由于该语言不提供此功能,Visitor 模式只是使用内置的单一调度两次,依次使用每个动态参数作为 this
。
可以想象,您可以通过继续这个抢椅子游戏来实现执行三次或更多次调度的访客,直到所有动态参数都this
一次并且在最终调用之前被正确调度。
关于c++ - 我们在 C++ 中需要双分派(dispatch)/访问者到底发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58134953/
在使用 dispatch 更新 useReducer 状态后,我需要能够立即执行操作。但是 dispatch 运行异步所以当我运行我的下一段代码时,它在 dispatch 应该更新它之前使用旧状态。
我是 Redux 新手。我必须调度一个操作来更新应用程序的状态,然后使用更新状态来调用我的后端。我使用 thunkMiddleware。 const mapDispatchToProps = disp
我是 Redux 新手。我必须调度一个操作来更新应用程序的状态,然后使用更新状态来调用我的后端。我使用 thunkMiddleware。 const mapDispatchToProps = disp
当我单击 InspectorOption 组件之一时,我的 redux 记录器显示已分派(dispatch)操作并且状态按预期更新。 我的 InspectorSelect 和子 InspectorOp
我有一个模块,其中包含一组函数,实现为带有辅助函数的分派(dispatch)哈希: my $functions = { 'f1' => sub { my %args = @_;
Apple 的 GCD 文档说明如下: GCD provides and manages FIFO queues to which your application can submit tasks
所以我正在获取此 UIImage 数据并将其转换为 base64 中的字符串。问题是它在转换时卡在 UI 线程上,我不确定为什么。 - (void)processImage:(UIImage*)ima
我有一个从后台线程调用的函数 func getValue() -> Bool。这是有意的,也是必须的。现在,getValue() 需要在主线程上执行一些操作,在这种情况下它需要访问 UIApplica
我有一个带有表单的组件,可以将项目添加到列表中。成功将项目添加到列表后,我想使用 form.resetForm(); ,但我想不出一个简单的方法来知道该操作何时成功。我希望我可以订阅 Action 调
我正在努力在 Laravel 6.x 中使用 cursor() 方法获取 3M+ 记录时降低内存。 我有一个 artisan 命令运行以下代码: Product::cursor()->each(fun
好的,所以我一直在尝试通过并发编辑设置电子表格应用程序。我走了laravel回声,redis,套接字路由。 (任何有关仅使用推动器的建议都会被驳回)。现在大多数情况下,我已经开始工作了,我可以从修补匠
假设我有这个布局 span 我将无处不在的点击转换为自定义事件,并使用委托(delegate)的非捕获处理程序将其分派(dispatch)到其原始目标: document.ad
页面加载后,我将在我的 index.js 中调度一个操作 store.dispatch(getWeatherReports()); 来访问天气 API。此操作通过 redux 过程,最终将返回的数据添
我有一个抽象父类 Parent 和六个子类 ChildA though ChildF。 另一个类 Other 有六个(静态)重载方法 olmeth(),六个子类中的每一个。 我怎么写: Parent
这里描述了类似的问题:GWT IllegalArgumentException: encodedRequest cannot be empty 我的GWT应用程序部署在Tomcat6中,该Tomcat
我正在尝试通过 iOS 上的 GCD 将一些代码分派(dispatch)到主队列,但即使是最简单的测试也总是失败。最后归结为: static const int TICK_INTERVAL = 1;
在某些情况下,覆盖扩展中的方法签名似乎会产生不可预知的结果。以下示例演示了具有相似模式的两个不同结果。 class A: UIViewController { func doThing() {
这个问题在这里已经有了答案: Is self retained within this Objective-C block? (1 个回答) 8年前关闭。 假设我有一个简单的电话 dispatch_a
React 中的上下文和 reducers 非常新。我目前正在尝试使用 Context 从折线图上的事件中获取日期字符串。我使用的折线图来自 react-chartjs-2。 我的上下文已设置并提供如
我有一个项目,其中nodejs服务器通过socket.io将推送事件传递到react仪表板,我正在使用Redux。当收到新数据时,会触发一个操作来更新所有相关组件,尽管我不确定我这样做的方式是否正确。
我是一名优秀的程序员,十分优秀!