我已经导出了很多样板的函数,我试图使用字符串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文件中使用点。
答案 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";
});