Re: state of the art dynamic multiple dispatching (multimethods) ?
On Dec 17, 1:04 pm, Mathias Gaunard <loufo...@gmail.com> wrote:
On Dec 16, 11:27 pm, Larry Evans <cppljev...@gmail.com> wrote:
I think Bernard means visitation of n arguments where n can be
more than 2, and variant visitation is limited to at most
n==2 arguments, according to:
http://www.boost.org/doc/libs/1_45_0/doc/html/variant/tutorial.html#v...
That's an implementation limitation, nothing prevents it from scaling
to n.
Nary visitation is defined by functional composition of n unary
visitations.
Yes, I think that we are all in agreement on that :).
I'm sorry that I was not clear in my first message[0] :
I was just thinking that the usual visitor implementations in C++03
made multiple dispatching over n >2 args tedious (but not especially
complex as you correctly point out).
Larry's nice code showed me that it is not the case anymore in C++0X
(btw, I think it'd deserve a post on cpp-next :) ).
However, for my toy interpreters, solutions based on
boost::variant<> only allow me to handle (efficient) runtime
dispatching over "static" type of the interpreted language
because if I store a derived* as a base* in a
boost::variant<base*, derived*>,
the dispatch will be performed on base* type[1].
This can be ok to implement overloading in the implemented language
i.e. for arithmetic operators over the primitive types that are not
subject to inheritance.
At first, I though I'd implement binary operators as dispatch over
(op, arg1, arg2), hence the need for at least ternary dispatch
but I don't for reasons that will be revealed in my next
post to this group (I'd rather start a new thread as it won't
be directly related to multiple dispatching).
Thanks again for your insights (and I do think that the
variadic visitors deserve more exposure, as it was exactly
kind of things I'd been unable to find on the net when looking
for advances in multiple dispatching in C++).
Best regards
Bernard
[0]" with a visitor pattern, that did not scale very well wrt to
the nb of args on which to perform the dispatch"
[1]
"
struct object {};
struct derived : object {};
typedef boost::variant<double, object*, derived*> var_t;
....
std::vector<var_t> stack;
object* base(new derived());
stack.push_back(base);
stack.push_back(777.0);
adder a;//add 777 to object, not derived
boost::apply_visitor(a, stack[0], stack[1]);
"
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]