我正在为现有的C库开发一些D绑定,我有一堆函数定义,还有一堆绑定.例如:
// Functions
void function(int) funcA;
long function() funcB;
bool function(bool) funcC;
char function(string) funcD;
// etc...
// Bindings
if(!presentInLibrary("func")) return false;
if(!bindFunction(funcA, "funcA")) return false;
if(!bindFunction(funcB, "funcB")) return false;
if(!bindFunction(funcC, "funcC")) return false;
if(!bindFunction(funcD, "funcD")) return false;
// etc...
Run Code Online (Sandbox Code Playgroud)
此模型与Derelict处理OpenGL扩展加载的方式非常相似.但是,这似乎是很多冗余的打字.我真的想要一种表达上面"绑定"部分的方法:
BINDGROUP("func", "funcA", "funcB", "funcC", "funcD", ...); // Name of function group, then variable list of function names.
Run Code Online (Sandbox Code Playgroud)
这是可以用mixins完成的吗?
小智 5
我在动态加载时使用了这个,但它没有回答你的问题,你可以调整它:
void function() a;
int function(int) b;
void function(string) c;
string bindFunctions(string[] funcs...)
{
string ret;
foreach (func; funcs)
{
ret ~= func ~ ` = cast(typeof(` ~ func ~ `))lib.getSymbol("` ~ func ~ `");`;
}
return ret;
}
mixin(bindFunctions("a", "b", "c"));
Run Code Online (Sandbox Code Playgroud)
这里bindFunctions("a", "b", "c")返回一个类似于的字符串:
a = cast(typeof(a))lib.getSymbol("a");
b = cast(typeof(b))lib.getSymbol("b");
c = cast(typeof(c))lib.getSymbol("c");
Run Code Online (Sandbox Code Playgroud)
从哪里lib.getSymbol()返回指针dl_open()等.希望这会有所帮助.