参数声明:在 D 中传递未知类型的函数

parameter declaration: passing a function of unknown type in D

考虑一个函数 foo,它采用另一个函数 f 和未知类型的数据 d。如果在函数定义时既不知道f 的return 类型,也不知道d 的类型,那么如何指定函数声明?也就是说,我该如何表达如下内容:

void foo(_ f, _ d) {
    // ..

其中 _ 表示 wildcard/catch-all 类型匹配。

另一个扩展问题:如果它们的身份可以是任何东西,是否可以指定类型相同?换句话说 _ 可以是任何类型,但类型必须相同。

函数必须知道它们的类型。否则很难为它们生成代码,而且链接器肯定无法处理它们。也就是说,与 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 的很多基础知识,我建议你考虑通读整本书(或至少通读一遍)。