有人可以解释D语言模板的简写形式吗?

时间:2012-12-07 02:06:54

标签: d

我有一位教授用简写的方式为D模板写了他的所有例子:

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

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

2 个答案:

答案 0 :(得分:15)

在函数模板中,第一组parens包含模板参数,第二组包含函数参数。

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){}是一个带参数的结构模板吨。

这个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”,这意味着“隐式函数模板实例化”。

答案 1 :(得分:3)

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

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

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

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

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

,它甚至可以是一个字符串

{C}中的T参数只是一个类型符号。

该功能只适用于仿函数。这是最强的版本:

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