On 8/27/2012 3:32 AM, Manu wrote:
Here's an advanced trick I use a lot since D doesn't extern to static C++
methods (heavily simplified, this is way out of context):
struct CPPClass
{
this()
{
// not my actual code, but effectively, write 'this' and the C++ method
pointer into a delegate on initialisation [I wrap this process up using magic]
void** pDelegate = cast(void**)&cppNonVirtualMethod;
pDelegate[0] = this;
pDelegate[1] = pCPPMethodPointer;
}
void delegate(int x = 0) cppNonVirtualMethod; // C++ methods often have
default args
void delegate(int x) cppNonVirtualMethod;
void callCppNonVirtualMethod(int x) { (*cppNonVirtualMethod)(x); }
void callCppNonVirtualMethod() { callCppNonVirtualMethod(0); }
With inlining on, the calls to the second overload should disappear, and you
have the same code generated as you would for the default arg method. You could
probably reduce the typing with some sort of mixin template, but this is the
basic idea.
private:
// C++ method pointer received from foreign code during initialisation
static void* pCPPMethodPointer;
}