考虑函数foo
,它需要另一个函数f
和未知类型d
的数据。如果函数定义时返回类型f
和d
的类型都未知,那么函数声明如何指定?也就是说,我怎么能表达类似如下:参数声明:在D中传递一个未知类型的函数
void foo(_ f, _ d) {
// ..
其中_
表示通配符/捕获所有匹配的类型。
扩展的另一个问题:是否可以指定如果他们的身份可以是任何类型的类型是相同的?换言之,_
可能是任何类型,但类型需要相同。
考虑函数foo
,它需要另一个函数f
和未知类型d
的数据。如果函数定义时返回类型f
和d
的类型都未知,那么函数声明如何指定?也就是说,我怎么能表达类似如下:参数声明:在D中传递一个未知类型的函数
void foo(_ f, _ d) {
// ..
其中_
表示通配符/捕获所有匹配的类型。
扩展的另一个问题:是否可以指定如果他们的身份可以是任何类型的类型是相同的?换言之,_
可能是任何类型,但类型需要相同。
函数必须知道它们的类型。否则,为它们生成代码将非常困难,而链接器当然无法处理它们。就像C++一样,D有模板,所以你可以声明函数模板,以便在编译使用它的代码时生成和编译函数本身。所以,如果你想要一个函数接受两个相同类型的参数,但可以处理不同的类型,那么你就需要使用一个函数模板。例如
void foo(T)(T a, T b)
{
...
}
或者如果需要有多种类型,你可以不喜欢
void foo(T, U)(T a, U b)
{
...
}
在这两种情况下,当代码然后调用foo
,参数类型将由从类型编译器来推断的实际论点。调用具有不同参数类型的相同函数模板将导致编译器生成附加函数。官方文档的相关部分是在这里:
http://dlang.org/spec/template.html#function-templates
但是从在线本章的这本书很可能是更多的信息:
http://ddili.org/ders/d.en/templates.html
我建议你考虑阅读整本书(或至少看看它)如果你想要的东西,解释了D的基本知识很多。
经过仔细审查,它看起来像模板(https://dlang.org/spec/template.html)被设计为t o通过提供一种通用功能的方法来帮助解决这些问题。如果有人想提出其他方法,请分享。 –