我有一位教授用简写的方式为D模板写了他的所有例子:
T exec(alias f,T)(T t) {
return f(t);
}
我找不到任何解释这意味着什么的例子。有人可以在这解释一下吗?
答案 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