C++中的多个调度

Mar*_*tin 36 c++ multiple-dispatch

我想了解多次发送是什么.我阅读了很多不同的文本,但我仍然不知道多重发送是什么以及它有什么好处.也许我缺少的是使用多个调度的代码片段.请问,您是否可以使用多个调度在C++中编写一小段代码,以便我可以看到它无法正确编译/运行,因为C++只有单个调度?我需要看到差异.谢谢.

Aar*_*ron 65

多分派是能够根据传递给函数调用的参数的运行时类型来选择要调用的函数版本.

这是一个在C++中无法正常工作的示例(未经测试):

class A { };
class B : public A { };
class C : public A { }


class Foo
{
  virtual void MyFn(A* arg1, A* arg2) { printf("A,A\n"); }
  virtual void MyFn(B* arg1, B* arg2) { printf("B,B\n"); }
  virtual void MyFn(C* arg1, B* arg2) { printf("C,B\n"); }
  virtual void MyFn(B* arg1, C* arg2) { printf("B,C\n"); }
  virtual void MyFn(C* arg1, C* arg2) { printf("C,C\n"); }
};

void CallMyFn(A* arg1, A* arg2)
{
  // ideally, with multi-dispatch, at this point the correct MyFn() 
  // would be called, based on the RUNTIME type of arg1 and arg2
  pFoo->MyFn(arg1, arg2);
}

...

A* arg1 = new B();
A* arg2 = new C();
// Using multi-dispatch this would print "B,C"... but because C++ only
// uses single-dispatch it will print out "A,A"
CallMyFn(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

  • 清楚说明问题的代码为+1 (4认同)
  • 一个应用是物理学,与另一个立方体碰撞的立方体是一个交叉点,与平面碰撞的立方体是不同的交叉点.因此,您最终会得到相当多的不同碰撞检测方法,并且调度对此非常有用.这是双重调度的一个主题,http://www.gamedev.net/topic/453624-double-dispatch-in-c/ (4认同)
  • 另一个应用是编程语言.假设您希望加号运算符('+')在两个参数都是整数时计算整数结果,当任一参数是浮点数时浮点数,以及当两个参数都是字符串时串联字符串.您有一个从"表达式"派生的类型层次结构,因此您希望在添加(exp1,exp2)或expr1-> add(expr2)时调用的函数依赖于exp1和exp2的实际类型. (4认同)

Sco*_*ham 20

多次调度是指执行的函数取决于多个对象的运行时类型.

C++具有单一调度,因为当您使用虚函数时,运行的实际函数仅取决于 - >或左侧对象的运行时类型.运营商.

我正在努力想到一个真正的多调度编程案例.也许在各种角色互相争斗的游戏中.

void Fight(Opponent& opponent1, Opponent& opponent2);
Run Code Online (Sandbox Code Playgroud)

战斗的胜利者可能取决于两个对手的特征,因此您可能希望此调用分派到以下之一,具体取决于两个参数的运行时类型:

void Fight(Elephant& elephant, Mouse& mouse)
{
    mouse.Scare(elephant);
}

void Fight(Ninja& ninja, Mouse& mouse)
{
    ninja.KarateChop(mouse);
}

void Fight(Cat& cat, Mouse& mouse)
{
    cat.Catch(mouse);
}

void Fight(Ninja& ninja, Elephant& elephant)
{
    elephant.Trample(ninja);
}

// Etc.
Run Code Online (Sandbox Code Playgroud)

该函数的作用取决于两个参数的类型,而不仅仅是一个.在C++中,您可能必须将其编写为一些虚函数.将根据一个参数(this指针)选择虚函数.然后,虚函数可能需要包含一个开关或某些东西,以执行另一个参数特定的操作.

  • 我失踪了海盗.但是好的,谢谢你举个例子. (4认同)
  • 一个实际的,经常发生的例子是不同于基类指针数组处理不同的子类. (3认同)

Nem*_*vic 11

请参阅B. Stroustrup撰写的这篇文章:Open C++的多方法

  • 尽管我给出了+1,但您应该为该文章提供一个摘要...该文章还仅涵盖方法重写,而不涉及所有多个调度案例。 (2认同)