从字符串mixin调用函数引用

时间:2012-10-31 01:57:23

标签: d dllexport

我已经导出了很多样板的函数,我试图使用字符串mixins来帮助隐藏乱七八糟的东西。问题是我不知道如何将匿名函数传递给字符串mixin。如果可能的话,我想避免将函数写为字符串。

// The function that the anonymous function below ultimately gets passed to.
char* magic(F...)(string function(F) func) { ... }

string genDcode(string name, alias func)() {
    return xformat(q{
        extern(C) export char* %s(int blah) {
            // What would I inject into the string in place of 'func'
            // in order to call the 'func' passed into the template?
            return magic(func);
        }
    }, name);
}

// Calls a function to generate code to mix into the global scope.
// The anonymous function must allow abritrary parameters.
mixin(genDcode!("funcName", function(string foo, float bar) {
    return "Herpderp";
}));

这当然不是全貌,大部分样板都经过修剪,但足以显示问题。我已经考虑过将函数指针注入一个int,然后重新转换为可调用类型,但不出所料,你只能在运行时获取函数指针。

我尝试过mixin模板,它可以消除函数传递问题,但链接器似乎无法找到从这些mixin生成的导出函数。它们似乎有一些额外的限定符,我不能在DEF文件中使用点。

1 个答案:

答案 0 :(得分:1)

老问题,但是一个相对较新的功能可能有助于解决它:D现在有一个pragma(mangle),你可以把它放在一个mixin模板中来强制链接器的特定名称:

mixin template genDcode(string name, alias func) {
          // pragma mangle is seen by the linker instead of the name...
        pragma(mangle, name) extern(C) export char* impl(int blah) {
            return magic(func);
        }
}

char* magic(F...)(string function(F) func) { return null; }

mixin genDcode!("funcName", function(string foo, float bar) {
     return "Herpderp";
});