On Tue, 17 Jun 2003 09:07:06 +0100 Alastair Reid <alastair@reid-consulting-uk.ltd.uk> wrote:
On Tuesday 17 June 2003 2:33 am, Abraham Egnor wrote:
I'd like to make a haskell binding for a C++ library. Most of the tools out there seem oriented towards c bindings, so it looks like I'll be writing the FFI code generator myself. While I'm at it I figure I might as well just make a general C++ binding tool. I've been thinking about this, and I'd like some feedback on the ideas I've had.
All previous interfaces to C++ libraries that I know of have been created by writing a bunch of wrapper functions with C-style types like these wrapper for a virtual function 'foo'.
void foo_T(S x) { x->foo(); } void foo_T(T x) { x->foo(); } void foo_T(U x) { x->foo(); }
[Note that these are C++ functions but that their type is one that C programs can call.]
I'm assuming you don't want overloading here as these aren't functions that can be called in C (or C99?).
People have shied away from trying to create a more direct interface because:
1) C++ is a huge language (with the complexity mostly in types, classes and templates where you can't easily avoid them) and it seems that to be able to cope with any reasonable number of C++ libraries, you'd have to implement a large part of that language.
2) C++'s type/ class system is quite different from Haskell's class system. Any mapping of on to the other is likely to fall apart rather quickly.
If the code you are interfacing to doesn't make too much use of templates then you can do what I did and hack together a SWIG module to flatten the C++ to C (I had hoped that that would already be available as it effectively does that anyways but I couldn't find it).