2

如果您定义一个接受委托的函数,则 D 可以在您调用该函数时对委托参数进行类型推断。所以如果我写一个带有签名的函数:

void foo(void delegate(int,string) dlg)

我可以使用以下方法调用它:

foo((a,b){});

D 会推断出aisintbis string

但是,如果我事先不知道代表将有多少个参数怎么办?如果我写

void foo(T...)(void delegate(T) dlg)

我可以打电话:

foo((int a,string b,char c,boolean d){});

但是我必须为每个参数指定类型。

现在,我想foo接受一个带有任意数量参数的委托——所有参数都相同。所以我可以打电话:

foo((a,b,c,d,e,f,g){});

D 会推断出atog都是strings。

请注意,我需要的不是可变函数。dlg它本身不接受任何数量的参数,而是foo接受具有任意数量参数的委托。

可以在D中做到这一点吗?

编辑
实际上,如果我可以定义一个默认参数会更好,所以我可以写

foo((a,b,int c,d){});

and a, bandd将是字符串,而cwill 是int.

4

1 回答 1

3

这可能是一个增强请求。但是现在你可以在编译时将它作为别名传递:

import std.stdio;

void foo(alias dlg)()
{
    dlg(1, 2.0, [3], "a");
    dlg(1.0, 2, [[3]], "b");
}

void main()
{
    foo!((a, b, c, d) { writefln("%s %s %s %s", a, b, c, d); } )();
}
于 2013-03-20T01:59:59.973 回答