Comments 16
Очень часто материал подается с точки зрения «ух ты посмотри как тут много винтиков, гаек, планок и отвертка с ключом!», но не приводится примера задачи куда это применить можно. Многие думают, что полиморфизм это свойство исключительно ООП.
С указателями разобрались, с пузырьком тоже, но чем вам std::sort не угодил?
Кстати, лайфхак: если неохота читать и даже писать страшный тайпдефы:
Кстати, лайфхак: если неохота читать и даже писать страшный тайпдефы:
template <typename BinaryFunction>
void sort(BinaryFunction comparator) { ... };
// ...
sort( [](int a, int b) { return true; /* ... */ } );
Мне кажется, что из текста достаточно ясно, что цель статьи — это не сделать дубликат std::sort, а проиллюстрировать концепцию. То же самое можно было бы продемонстрировать на многих других алгоритмах.
Как по мне, эту концепцию отлично иллюстрируют custom deter-ы:
using AutoFile = std::unique_ptr<FILE, decltype(&fclose)>;
const auto openFileInC = [](const std::string& name) { return AutoFile(fopen(name.c_str(), "w"), fclose); };
using AutoHandle = std::unique_ptr<void, decltype(&CloseHandle)>;
const auto openFileInApi = [](const std::string& name)
{
return AutoHandle(::CreateFileA(name.c_str(), FILE_ALL_ACCESS, 0, nullptr, CREATE_ALWAYS, 0, nullptr), CloseHandle);
};
int main()
{
// RAII wrapper will auto close descriptor
auto fileInC = openFileInC("1.txt");
fprintf(fileInC.get(), "Hello");
// RAII wrapper will auto close handle
auto fileInApi = openFileInApi("2.txt");
WriteFile(fileInApi.get(), "World", 5, nullptr, nullptr);
return 0;
}
К слову это не пузырек, а сортировка выбором.
А это точно про полиморфизм? Вижу тут только функциональную переменную. Полиморфная функция должна сама переключаться на нужную реализацию в зависимости от параметра, а вы тут выбор руками делаете.
В контексте функции sortCities(CompareFunction compare) так и делается. Передается параметр и переключается на нужную реализацию. А ручной выбор в main() — это уже следующий слой.
Нет, в общепринятом смысле полиморфное поведение управляется типом самих данных, а не дополнительным параметром.
Ну, это же не проблема. Давайте весь код (кроме main) завернем в какой-нибудь класс и будет то, о чем Вы говорите. Смысл-то абсолютно тот же, что в полиморфизме.
Идея полиморфизма же заключается не в том, чтобы тип чем-то управлял, а в том, что одна и та же строка кода работала по-разному в зависимости от того, что туда «подложат». Перегрузка операторов — это тоже вид полиморфизма.
Идея полиморфизма же заключается не в том, чтобы тип чем-то управлял, а в том, что одна и та же строка кода работала по-разному в зависимости от того, что туда «подложат». Перегрузка операторов — это тоже вид полиморфизма.
Я думаю автор имел в виду subtype polymorphism в вариации для функций первого класса. Вы же говорите про ad hoc polymorphism.
«В языках программирования и теории типов полиморфизмом называется способность функции обрабатывать данные разных типов»
В упор не вижу полиморфизма. Скорее тут можно говорить про паттерн «Стратегия».
В упор не вижу полиморфизма. Скорее тут можно говорить про паттерн «Стратегия».
А можно увидеть вариант с кастомной сортировкой произвольного массива, а то пример получается слишком далёким от реальности.
Может я несколько выпал из времени, но, например, qsort так работает испокон веков...
Для белого пояса самое то, спасибо!
Sign up to leave a comment.
Полиморфизм и указатели на функции