Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
D 从字符串mixin调用函数引用_D_Dllexport - Fatal编程技术网

D 从字符串mixin调用函数引用

D 从字符串mixin调用函数引用,d,dllexport,D,Dllexport,我已经用相当多的样板文件导出了函数,并且尝试使用字符串混合来帮助隐藏混乱并使其变得更甜。问题是我不知道如何将匿名函数传递到字符串mixin中。如果可能的话,我希望避免将函数写成字符串 //下面的匿名函数最终传递给的函数。 char*magic(F…)(字符串函数(F)func){…} 字符串编码(字符串名称,别名func)(){ 返回xformat(q{ 外部(C)导出字符*%s(int blah){ //我应该在字符串中插入什么来代替'func' //为了调用传递到模板中的“func”? 返回

我已经用相当多的样板文件导出了函数,并且尝试使用字符串混合来帮助隐藏混乱并使其变得更甜。问题是我不知道如何将匿名函数传递到字符串mixin中。如果可能的话,我希望避免将函数写成字符串

//下面的匿名函数最终传递给的函数。
char*magic(F…)(字符串函数(F)func){…}
字符串编码(字符串名称,别名func)(){
返回xformat(q{
外部(C)导出字符*%s(int blah){
//我应该在字符串中插入什么来代替'func'
//为了调用传递到模板中的“func”?
返回魔法(func);
}
},姓名);
}
//调用函数以生成要混合到全局范围的代码。
//匿名函数必须允许使用辅助参数。
mixin(genDcode!(“funcName”),函数(字符串foo,浮动条){
返回“Herpderp”;
}));
这当然不是全貌,大部分样板都经过了修整,但足以说明问题所在。我曾考虑过将函数指针作为int注入,并将其转换回可调用类型,但毫不奇怪,您只能在运行时获得函数指针


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

旧问题,但一个相对新的功能可能有助于解决它: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";
});

如果
func
是一个命名且可访问的符号,例如一个常规命名函数,则可以使用
\uuu traits(identifier,func)
获取对它的混合字符串引用,但这不适用于匿名符号。Mixin模板在这里不起作用,因为Mixin模板中的函数名无论链接如何都会被破坏。我希望这是固定的,因为mixin模板更干净,感觉不那么粗糙。无论如何,如果合并了下面的pull请求,mixin模板方法在将来可能更可行:谢谢,我会关注这个pull请求。我想在模板中使用时必须小心避免重复的“损坏”名称,但在我的例子中,这不应该是一个问题,因为名称是模板参数之一。