Thread overview
Call delegate from C++
Apr 24, 2019
Nicholas Wilson
Apr 24, 2019
Jacob Carlborg
Apr 26, 2019
Alex
April 24, 2019
How do you pass a delegate to a c++ function to be called by it?

The function to pass the delegate to is:

extern (C++) int
fakeEntrypoint(
    extern(C++) void function(void* /*delegate's context*/) func,
    void* /*delegate's context*/ arg);


What I want is:

int entrypoint(scope void delegate() func)
{
    return fakeEntrypoint(
                // for some reason func.funcptr is void function()
                cast(void function(void*))func.funcptr,
                func.ptr);
}

but that fails with

cannot pass argument cast(void function(void*))func.funcptr of type
void function(void*) to parameter extern (C++) void function(void*) func


April 24, 2019
On 2019-04-24 18:20, Nicholas Wilson wrote:
> How do you pass a delegate to a c++ function to be called by it?
> 
> The function to pass the delegate to is:
> 
> extern (C++) int
> fakeEntrypoint(
>      extern(C++) void function(void* /*delegate's context*/) func,
>      void* /*delegate's context*/ arg);
> 
> 
> What I want is:
> 
> int entrypoint(scope void delegate() func)
> {
>      return fakeEntrypoint(
>                  // for some reason func.funcptr is void function()
>                  cast(void function(void*))func.funcptr,
>                  func.ptr);
> }
> 
> but that fails with
> 
> cannot pass argument cast(void function(void*))func.funcptr of type
> void function(void*) to parameter extern (C++) void function(void*) func

You probably need to include `extern(C++)` in the cast, if that's possible.

-- 
/Jacob Carlborg
April 26, 2019
On Wednesday, 24 April 2019 at 16:20:17 UTC, Nicholas Wilson wrote:
> How do you pass a delegate to a c++ function to be called by it?
>
> The function to pass the delegate to is:
>
> extern (C++) int
> fakeEntrypoint(
>     extern(C++) void function(void* /*delegate's context*/) func,
>     void* /*delegate's context*/ arg);
>
>
> What I want is:
>
> int entrypoint(scope void delegate() func)
> {
>     return fakeEntrypoint(
>                 // for some reason func.funcptr is void function()
>                 cast(void function(void*))func.funcptr,
>                 func.ptr);
> }
>
> but that fails with
>
> cannot pass argument cast(void function(void*))func.funcptr of type
> void function(void*) to parameter extern (C++) void function(void*) func

It's clear that your delegate is not extern C++


int entrypoint(scope extern(C++) void delegate() func)