在D中具有可变数量的字符串参数的Mixins?

时间:2011-06-21 18:03:38

标签: d mixins

我正在为现有的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...

此模型与Derelict处理OpenGL扩展加载的方式非常相似。但是,这似乎是很多冗余的打字。我真的想要一种方法来表达上面的“绑定”部分,如:

BINDGROUP("func", "funcA", "funcB", "funcC", "funcD", ...); // Name of function group, then variable list of function names.

这可以用mixins来完成吗?

3 个答案:

答案 0 :(得分: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"));

此处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");

lib.getSymbol()dl_open()返回指针等等。希望这会有所帮助。

答案 1 :(得分:4)

我认为你的意思是字符串mixins?你可以直接使用D的vararg语法:

string BINDGROUP(string functionGroup, string[] functions...)
{
    // ...
}

mixin(BINDGROUP("func", "funcA", "funcB", "funcC", "funcD"));

答案 2 :(得分:4)

我相信这就是你要找的东西

template BINDGROUP(string group,T...){
    alias BINDGROUP presentInLibrary("func") && BINDGROUPFUNCS!(T);
}

template BINDGROUPFUNCS(T...){
    static if(T.length)alias BINDGROUPFUNCS true; // all is successful
    else alias BINDGROUPFUNCS bindFunction(mixin(T), T) && BINDGROUPFuncts!(T[1..$]);
}

我在这里使用递归模板声明,你也可以使用foreach循环