Ответ 1
В шаблоне функции первый набор парендов содержит аргументы шаблона, а второй набор содержит аргументы функции.
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", что означает "неявное создание шаблона функции".