Re: Double-dispatch
On 13/02/11 9:32 PM, Sean Eskapp wrote: == Quote from bearophile (bearophileh...@lycos.com)'s article Sean Eskapp: Is there a nicer way to do this in D, or am I stuck with the same thing? Andrei has recently said no one needs double dispatch (in D) :-) So Andrei will be interested in your use case. Bye, bearophile The age-old collision handling problem is how I'm using it. Use a 2D array of function pointers, with the indices coming from unique IDs on the shapes.
Double-dispatch
I remember in C++, I had to do double-dispatch using the visitor pattern. This is cumbersome, just because each subclass has to have the exact same singly-dispatched code that looks like: void dispatch(Base other) { other.dispatch(*this); } Is there a nicer way to do this in D, or am I stuck with the same thing?
Re: Double-dispatch
Sean Eskapp eatingstap...@gmail.com wrote: I remember in C++, I had to do double-dispatch using the visitor pattern. This is cumbersome, just because each subclass has to have the exact same singly-dispatched code that looks like: void dispatch(Base other) { other.dispatch(*this); } Is there a nicer way to do this in D, or am I stuck with the same thing? Andrei Alexandrescu (yes, the same one) wrote a generic implementation of multimethods[1] for his book Modern C++ Design[2]. You might want to take a look at that. If you decide to re-implement it in D, it might also be worth incorporating in Phobos. [1]: http://loki-lib.cvs.sourceforge.net/loki-lib/loki/include/loki/MultiMethods.h?view=markup [2]: http://www.amazon.com/a/dp/0201704315/ -- Simen
Re: Double-dispatch
Sean Eskapp wrote: I remember in C++, I had to do double-dispatch using the visitor pattern. This is cumbersome, just because each subclass has to have the exact same singly-dispatched code that looks like: void dispatch(Base other) { other.dispatch(*this); } Is there a nicer way to do this in D, or am I stuck with the same thing? There isn't really, but you can take out some of the boilerplate with a mixin, which goes a long way: // The template parameter Visitor is not actually needed, depending on // what you want to do mixin template Accept(Visitor) { void accept(Visitor v) { v.visit(this); } } class Stuff { mixin Accept!IStuffVisitor; } With some ctfe it's also not too hard to take out the boilerplate of creating the visitor interface with a bit of code generation, though I'm not sure if it's worth it.
Re: Double-dispatch
Sean Eskapp: Is there a nicer way to do this in D, or am I stuck with the same thing? Andrei has recently said no one needs double dispatch (in D) :-) So Andrei will be interested in your use case. Bye, bearophile
Re: Double-dispatch
== Quote from bearophile (bearophileh...@lycos.com)'s article Sean Eskapp: Is there a nicer way to do this in D, or am I stuck with the same thing? Andrei has recently said no one needs double dispatch (in D) :-) So Andrei will be interested in your use case. Bye, bearophile The age-old collision handling problem is how I'm using it.