【发布时间】:2020-06-03 03:24:32
【问题描述】:
我需要以下类型的调度函数。在我的应用程序中,我真正拥有的是一个指向状态基类 (foo) 的指针以及一个指向测量基类 (bar) 的指针。根据传递给 dispatch2 函数的派生实例,我需要在给定状态的情况下生成估计的测量值。例如,派生的状态类可以是位置,而派生的测量类可以是 ToF(飞行时间)。然后,处理程序将获取来自 f 的状态信息(例如发射器位置)以及来自 b 的收集器信息(例如传感器位置),并计算给定这些的预期 ToF。然后将其返回并与实际测量值 (b) 进行比较。
string dispatch2(foo* f, bar* b) {
if ( dynamic_cast<Foo>(f) ) return foo1(f,b);
else if ( dynamic_cast<FOo>(f) ) return foo2(f,b);
else if ( dynamic_cast<FOO>(f) ) return foo3(f,b);
throw std::runtime_error("dispatch for f not defined");
}
string foo1(foo* f, bar* b) {
if ( dynamic_cast<Bar>(b) ) return foo1bar1handler(f,b);
else if ( dynamic_cast<BAR>(b) ) return foo1bar2handler(f,b);
throw std::runtime_error("foo1: dispatch for b not defined");
}
string foo2(foo* f, bar* b) {
if ( dynamic_cast<Bar>(b) ) return foo2bar1handler(f,b);
else if ( dynamic_cast<BAR>(b) ) return foo2bar2handler(f,b);
throw std::runtime_error("foo2: dispatch for b not defined");
}
string foo3(foo* f, bar* b) {
if ( dynamic_cast<Bar>(b) ) return foo3bar1handler(f,b);
else if ( dynamic_cast<BAR>(b) ) return foo3bar2handler(f,b);
throw std::runtime_error("foo3: dispatch for b not defined");
}
string foo1bar1handler(foo* f, bar* b) {return "FooBar";}
string foo2bar2handler(foo* f, bar* b) {return "FooBAR";}
string foo3bar1handler(foo* f, bar* b) {return "FOoBar";}
string foo2bar2handler(foo* f, bar* b) {return "FOoBAR";}
string foo2bar1handler(foo* f, bar* b) {return "FOOBar";}
string foo2bar2handler(foo* f, bar* b) {return "FOOBAR";}
显然,没有办法绕过为我想明确处理的每个组合定义结束方法的需要。但是,我正在寻找实现这一点的替代方法。理想情况下,一些允许用户显式注册每个处理程序的模式,并且任何未处理的组合都可能引发运行时异常。任何建议,将不胜感激。谢谢
【问题讨论】:
-
我使用了映射,其中键是对,值是要调用的函数,其中无符号值是调用 typeinfo::hash() 的结果。抛出异常或其他行为很容易,这只是当映射没有与哈希值对匹配的键时所做的。
-
看看访客模式。
标签: c++ design-patterns dispatch