ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
1042586 Топик полностью
fk0, легенда (07.10.2020 12:29, просмотров: 397) ответил lloyd на Ну ладно вам, эти все шаблоны в динамических языках вообще не нужны, кек. А если сильно нужны - то генерируется текст и eval() на него (нет, правда)
Шаблоны работают не на уровне текста, а в пространстве типов. На уровне текста далеко не уедешь, ведь захочется не просто подставлять, а ещё понимать что именно тебе подсунули и в зависимости от аргумента делать выбор. В динамических языках динамическая же диспетчеризация. И в ряде статических (где нет статического полиморфизма). Что в лучшем случае -- далековато от оптимального кода. Если этот случай вообще наступит, возвращаясь к сортировке, а не припомню где можно 

сделать примерно следующее:


1) создать свой итератор над абстрактным (существующим только в голове у программиста) псевдо-контейнером, фактически являющимся курсором в базе данных на диске;

2) создать свои компараторы для типа возвращаемого итератором;

3) создать свою функцию swap (присваивания и конструирования с перемещением);

4) вызвать библиотечную функцию сортировки передав ей пару итераторов: тут компилятор сам находит функции компаратора и swap, сам генерирует код функции сортировки для данного случая и инлайнит функции сравнения/обмена прямо в код алгоритма сортировки;

5) получить отсортированную базу данных.


(да я понимаю, пример немного абсурдный, для работы с БД подхода как в C# было бы достаточно)


В динамических языках в лучшем случае ты отсортируешь структуру данных уже известную данному языку, список/вектор например. Сможешь задать свой компаратор (но это можно и в голом C -- qsort так и работает). Но создавать свои, не известные рантайму языка типы данных и научить с ними работать стандартный алгоритм -- далеко не везде ещё возможно.


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

[ZX]