Здравствуйте, so5team, Вы писали:
S>К тому, что происходит в C++ лучше всего подходит определение "шаблон функции", т.к. по сути мы имеем текстовый шаблон, на основании которого компилятор генерирует текст результирующей функции с подставленными параметрами
Ну так здесь "шаблон функции" и становится "шаблонной функцией" — функцией, сгенерированной по шаблону. "Шаблонный текст" — это
конкретный текст, написанный по шаблону текста, "шаблонное поведение" — тоже
конкретное поведение, реализующее шаблон поведения, и т.п.
S>Шаблонная функция лучше подходит к языкам вроде Java и C#, в которых обобщенное программирование реализовано через генерики. Там код шаблонной функции можно скомпилировать однажды (даже без актуальных параметров), а затем использовать этот скомпилированный код при вызове функции с разными типами параметров.
Если там при вызове функции вставляется автоматическое переключение на нужный вариант кода, то каждый из вариантов представляет собой "шаблонную функцию" в смысле C++ (результат порождения). Если же там сохраняется лишь предкомпилированный шаблон, а в момент вызова он докомпилируется на лету, то получается то же "шаблон функции", из которого "шаблонная функция" порождается на этапе выполнения.
S>Вас же не удивляет то, что
S>S>void f(int, int);
S>void f(long, long);
S>
S>получают в итоге разные сигнатуры.
Это как раз не удивляет. А вот о том, что можно смешивать шаблонные и нешаблонные функции с одинаковыми наборами типов, я давно и прочно забыл, поскольку никогда этим не пользовался. Только вот какой в этом может быть смысл? Разве только перекрыть ранее определенную нешаблонную функцию, но это ж получатся изрядные грабли.