Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
[Caml-list] dynamic dispatching
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2003-06-10 (10:34)
From: Ville-Pertti Keinonen <will@e...>
Subject: Re: [Caml-list] dynamic dispatching
> I have to reimplement some code written in C++.
> In C++ there is used a desgin pattern named Visitor, which i used 
> instead of a dynamic_cast.
> My question: is it generally possible to decide at runtime, if an 
> object is of a specific type ?!

If you're using the visitor design pattern, that probably means that 
you don't need to check the type at runtime.

> What I have read in the reference manual and some website's dynamic 
> typechecking is not supported, means this dynamic dispatching as well 
> ?!

If by dynamic dispatching you're referring to methods declared virtual 
in C++ -- all methods are like this in OCaml.

If you're referring to multimethods, neither C++ nor OCaml has that.

Anyway, if you aren't using dynamic_cast (or any other type-narrowing 
casts) in the C++ version, then the OCaml version can be implemented 
pretty much the same.

If you really need it, something similar to C++ dynamic_cast can be 
simulated in OCaml.  One way to do this is by implementing a method in 
your classes that you can use to check the type (e.g. a method is_type 
: string -> bool) and then using Obj.magic to "cast" the object to the 
confirmed type if successful (although Obj.magic isn't something you 
should generally use; it's basically equivalent to C++ 

BTW: Whenever you end up using the visitor design pattern, that may 
mean that you'd be better off separating the data from the functions 
manipulating it, not using classes at all.  OOP is highly overrated.

To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: