On Tue, 29 Nov 2011 16:46:55 +0100, deadalnix <deadal...@gmail.com> wrote:

Hi,

I did face a problem with extern(C++) again. Now we are talkign about const member method for structs. Here is a sample code to trigger the error :

extern(C++) {
        struct Fail {
                void method() {}
                void method() const {}
        }
}

It will generate the error Error: symbol `_ZN4Fail6methodEv' is already defined.

Both method are mangled the same way, regardless of constness.

On a more general basis, interfacing to C++ is damn hard to do safely ! If you put asside some mangling bugs, some D choices make it more difficult than necessary.

Notably, it's very difficult to map a C++ POD class with a default constructor and copy constructor/assignement overload. struct doesn't
Don't want to be picky, but a struct with default constructor is not a POD.
And yes it is not possible to map all C++ concepts to D.

allow for default constructor and copy constructor isn't mappable using posblit. final class imply an overhead, and are references types (so cannot be passed by value).
References only cost you an allocation, the call overhead is practically inexistent
(I'm not aware of any language that achieves this).

I've recently posted a feasible solution to allocate C++ classes using the
D garbage collector and profit from automatic lifetime management.
https://gist.github.com/1391734

Given that all bugs get sorted out, one can expect three mechanisms to work.

 - Calling free C++ functions and probably non-virtual methods
 - Pass POD data forth and back
 - Call virtual methods of classes with known vtable layout

Some more things as calling namespace function or certain templates could
probably be provided by a library. But it should suffice to provide zero overhead
interfacing to most C++ code.
Interfacing QT with it's heavy use of virtual calls, multiple-inheritance
and a custom pre-processor will require an additional simplifying wrapper layer
on the C++ side.

martin

Reply via email to