为什么这个功能被视为代表?

时间:2016-04-10 08:40:03

标签: c delegates arguments d function-literal

在尝试包装C函数进行回调时,我遇到了将成员函数视为委托的问题。 C函数不会接受代理,所以我选择了别的东西:

extern(C) void onMouse(void delegate(int, int, int) nothrow callback)
{
    glfwSetMouseButtonCallback(handle,
        function void (GLFWwindow* h, int button, int action, int mods) nothrow
        {
            callback(button, action, mods);
        }
    );
}

正如你所看到的,我传递给回调设置函数一个函数文字调用一个委托(这是我在这里传递的成员函数)。

然而,它并没有像我期望的那样结束:

Error: function pointer glfwSetMouseButtonCallback (GLFWwindow*, extern (C) void function(GLFWwindow*, int, int, int) nothrow) is not callable using argument types (GLFWwindow*, void delegate(GLFWwindow* h, int button, int action, int mods) nothrow @system)

在错误中,它将第二个参数显示为类型void delegate

因此。我的问题是:为什么会发生这种情况?正如您可以清楚地看到的那样,代码中显示function void

注意:我已经看到了这一点:Pass delegates to external C functions in D。 解决方案显然是一个黑客攻击。但如果我在互联网上找不到解决方法,我会尝试。

1 个答案:

答案 0 :(得分:1)

即使您将其声明为函数,也不能。它依赖于您传递给onMouse的参数。该参数是一个局部变量,在函数体中访问它们使它们成为委托。您所能做的就是将参数更改为function并将其传递给&callback(您需要添加GLFWwindow作为参数)。

或者,您可以创建一个全局列表,在该列表中,此回调会放置您可以在主循环中处理的事件。