Подтвердить что ты не робот

Может ли кто-нибудь объяснить сокращенную форму шаблона языка D?

У меня есть профессор, который написал все его примеры для шаблонов D в сокращенном виде:

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

Я не могу найти примеров, объясняющих, что это значит. Может ли кто-нибудь объяснить это?

4b9b3361

Ответ 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", что означает "неявное создание шаблона функции".

Ответ 2

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.

Параметр T, как и в С++, является просто символом типа.

Эта функция просто применяет функтор. Heres самая сильная версия:

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