D 类型推断具有未知数量的已知类型参数的委托参数
如果您定义了一个接受委托的函数,则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
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:这个问题被归档为