将代理传递给D中的外部C函数

如何在D中将代理传递给带有函数指针的外部C函数?

让我交叉发布我在新闻组中所说的内容:

如何使用函数指针将委托传递给外部C函数?

你不能直接做到这一点,除非你可以修改C函数,然后你可以破解它,但委托和常规函数指针是完全不同的动物。

但也许你可以魔术破解它。 注意:

// a C function that needs a plain function extern(C) void test(void function() f) { // pretend this is implemented in C f(); } // just create a random delegate void delegate() foo(int a) { return { import std.stdio; writeln(a); }; } // what we want to work void main() { auto dg = foo(10); dg(); // works //test(dg); // won't work test(bindDelegate(dg)); // we want this } // transform delegate into pointer.. import std.traits; auto bindDelegate(T, string file = __FILE__, size_t line = __LINE__)(T t) if(isDelegate!T) { static T dg; dg = t; extern(C) static ReturnType!T func(ParameterTypeTuple!T args) { return dg(args); } return &func; } 

bindDelegate所做的是为该特定调用创建一个特殊的静态变量和函数。 就好像我们写了一个单独的函数和全局来保存它。

__FILE__ ,_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ @