Здравствуйте, Евгений Музыченко, Вы писали:
S>>К тому, что происходит в C++ лучше всего подходит определение "шаблон функции", т.к. по сути мы имеем текстовый шаблон, на основании которого компилятор генерирует текст результирующей функции с подставленными параметрами
ЕМ>Ну так здесь "шаблон функции" и становится "шаблонной функцией" — функцией, сгенерированной по шаблону. "Шаблонный текст" — это конкретный текст, написанный по шаблону текста, "шаблонное поведение" — тоже конкретное поведение, реализующее шаблон поведения, и т.п.
Шаблон функции -- это как шаблон для заготовки. Вы берете шаблон и по шаблону изготавливаете деталь, далее используется уже конкретная деталь, а не шаблон.
Шаблонная функция -- это функция, которая напрямую и используется, которая выполняет одни и те же "шаблонные" действия, но для разных аргументов.
Поэтому в C++ имея шаблон:
template<typename T, typename U> void f(T a, U b);
вы в результате раскрытия шаблона (в зависимости от типов T и U) можете получить как:
void f(T1 a, U1 b) { a.f(b); }
так и:
void f(T2 a, U2 b) { b.g(a); }
так и:
void f(T3 a, U3 b) { a.f(); b.g(); }
так и:
void f(T4, U4) {}
и т.д.
А вот шаблонная функция в языках с генериками какой была, такой и останется. Например (псевдокод):
void F<T, U>(T a, U b) where A : IHasFMethod { a.f(b); }
ЕМ>Только вот какой в этом может быть смысл?
Такой же, как в перегрузке вообще. Такой же, как и в наличии специализации для шаблонов.