D 类型推断具有未知数量的已知类型参数的委托参数

D 类型推断具有未知数量的已知类型参数的委托参数,d,D,如果您定义了一个接受委托的函数,则D可以在调用该函数时推断委托参数。如果我写一个带有签名的函数: void foo(void delegate(int,string) dlg) 我可以用以下方式来称呼它: foo((a,b){}); D将推断a是int,b是string 但是,如果我事先不知道代理将有多少个参数,该怎么办?如果我写 void foo(T...)(void delegate(T) dlg) 我可以打电话: foo((int a,string b,char c,boolean

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

void foo(void delegate(int,string) dlg)
我可以用以下方式来称呼它:

foo((a,b){});
D将推断
a
int
b
string

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

void foo(T...)(void delegate(T) dlg)
我可以打电话:

foo((int a,string b,char c,boolean d){});
foo((a,b,c,d,e,f,g){});
但我必须为每个参数指定类型

现在,我希望
foo
接受一个具有任意数量的参数的委托-所有参数都是相同类型的。所以我可以打电话:

foo((int a,string b,char c,boolean d){});
foo((a,b,c,d,e,f,g){});
D将推断
a
g
都是
string
s

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

在D中可以这样做吗

编辑
实际上,如果我可以定义一个默认参数,那么我就可以编写

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

a
b
d
将是字符串,
c
将是
int
这可能是一个增强请求。但现在,您可以在编译时将其作为别名传递:

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); } )();
}

从技术上讲,这是不一样的,因为在这种情况下不会发生类型推断。别名委托将成为一个模板,并根据通常的使用情况进行实例化。据我所知,Idan询问了一些稍有不同的问题。实际上我可以使用这个,但出于某种原因,当我这样做时,
isCallable!dlg
返回false,因此我无法使用
参数标识符元组!dlg
参数类型元组!dlg
获取代理的参数类型和名称。有没有办法解决这个问题,或者我必须自己解析
dlg.stringof
来获取信息?好的,问题是
dlg
是一个模板,而不是一个委托。如果我使用
dlg(string,string,string,string)
我可以得到它的参数特征数据。我怎么知道一个模板有多少个模板参数呢?恐怕这种功能可能还没有被火卫一所涵盖。如果您知道允许使用的模板参数类型,那么实用程序模板编写起来非常简单,但大多数通用的模板听起来很棘手。@Idan Arye:这个问题被归档为