gpt4 book ai didi

c - 将委托(delegate)传递给 D 中的外部 C 函数

转载 作者:太空狗 更新时间:2023-10-29 17:22:53 25 4
gpt4 key购买 nike

如何在 D 中将委托(delegate)传递给采用函数指针的外部 C 函数?

最佳答案

让我交叉张贴我在新闻组上所说的话:

How do I pass a delegate to an external C function taking a function pointer?

一般不能直接做,除非能修改C功能,那么你可以绕过它,但是一个委托(delegate)和一个常规函数指针是完全不同的动物。

但也许你可以用魔法破解它。观察:

// 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__, __LINE__ 东西是一个肮脏的黑客来制作它为不同的对象实例化一个单独的变量+函数对行,因此持有委托(delegate)的全局变量不会如此很容易被覆盖。

关于c - 将委托(delegate)传递给 D 中的外部 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22845175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com