Шаблоны работают не на уровне текста, а в пространстве типов. На
уровне текста далеко не уедешь, ведь захочется не просто
подставлять, а ещё понимать что именно тебе подсунули и в
зависимости от аргумента делать выбор. В динамических языках
динамическая же диспетчеризация. И в ряде статических (где нет
статического полиморфизма). Что в лучшем случае -- далековато от
оптимального кода. Если этот случай вообще наступит, возвращаясь к
сортировке, а не припомню где можно сделать примерно следующее:
1) создать свой итератор над абстрактным (существующим только в голове у программиста) псевдо-контейнером, фактически являющимся курсором в базе данных на диске;
2) создать свои компараторы для типа возвращаемого итератором;
3) создать свою функцию swap (присваивания и конструирования с перемещением);
4) вызвать библиотечную функцию сортировки передав ей пару итераторов: тут компилятор сам находит функции компаратора и swap, сам генерирует код функции сортировки для данного случая и инлайнит функции сравнения/обмена прямо в код алгоритма сортировки;
5) получить отсортированную базу данных.
(да я понимаю, пример немного абсурдный, для работы с БД подхода как в C# было бы достаточно)
В динамических языках в лучшем случае ты отсортируешь структуру данных уже известную данному языку, список/вектор например. Сможешь задать свой компаратор (но это можно и в голом C -- qsort так и работает). Но создавать свои, не известные рантайму языка типы данных и научить с ними работать стандартный алгоритм -- далеко не везде ещё возможно.
Да во многих языках вообще понятия функции-"алгоритма" нет! По тем же причинам. Есть методы sort() у каждого контейнера. Создашь свой тип контейнера -- пиши свою сортировку сам. В том же C# можно написать generic-функцию сортировки, но будешь либо компаратор руками задавать, либо то что ты там сортируешь должно реализовать интерфейс (таскать в себе ссылку таблицу виртуальных функций, что очень удобно для какого-нибудь скалярного типа, вроде инта... чтоб каждый элемент вектора лежал отдельным объектом в куче). Такая же проблема со swap. И функции сравнения и обмена ты не можешь вывести сам, т.к. нет понятия специализации шаблона. Можешь в рантайме только узнать. И сразу оптимальный код алгоритма сгенерировать значит тоже никак, только обобщённый, который работать будет хуже. Хотя с парой костылей как-то заработает.