14

我有一位教授用速记写了他所有的 D 模板示例:

T exec(alias f,T)(T t) {
    return f(t);
}

我找不到任何解释这意味着什么的例子。这里有人可以解释一下吗?

4

2 回答 2

16

在函数模板中,第一组括号保存模板参数,第二组保存函数参数。

http://dlang.org/template.html#function-templates

您可以将其重写为:

template exec(alias f, T) {
    T exec(T t) {
         return f(t);
    }
}

在使用点,如果模板成员与模板本身同名,则不必写两次。这被称为同名技巧。http://www.bing.com/search?q=eponymous+trick+d+programming+language&qs=n&form=QBRE&pq=eponymous+trick+d+programming+languag&sc=0-0&sp=-1&sk=

尽管我见过的大多数 D 代码都使用较短的格式——对于函数、类或结构来说,长模板语法非常少见,它们也可以这样做:struct Foo(T) { } 是一个带有参数 T 的结构模板。

这个 exec 模板中的参数本身是“alias f”,它是您决定传递给它的任何符号,例如,函数或变量名,以及“T”,只是任何泛型类型。重复的 T 是对该类型的引用。

在使用点,您很可能会看到这样的情况:

int foo(int a) { return a; } // just a regular function
exec!(foo)(10); // instantiates the template with arguments (foo, int), and then calls the function.

这里的第二个模板参数由函数参数隐式计算出来。这在函数模板中很常见:很多模板参数都是隐式的,所以你很少看到它们被写出来。您可能会在 D 讨论中将其称为“IFTI”,意思是“隐式函数模板实例化”。

于 2012-12-07T02:20:37.860 回答
4
T exec(alias f,T)(T t) {
    return f(t);
}

这是一个速记模板函数。写它的“正常方式”是:

template exec(alias f, T) {
    T exec(T t) {
        return f(t);
    }
}

D中,如果模板范围内的符号与模板本身具有相同的名称,则可以将其用作模板(它是一个别名)。

然后,alias模板参数意味着它可以是任何东西——任何符号。在这里,它可以是一个委托、一个函数、一个函数,任何东西。如果您的老师使用std.functional.unaryFun.

参数,就像在 C++中T一样,只是一个类型符号。

该函数只应用一个函子。这是一个最强的版本:

https://github.com/D-Programming-Language/phobos/blob/master/std/functional.d#L39

于 2012-12-10T09:31:15.863 回答