Pull to refresh

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.

Articles