Pull to refresh

Comments 8

Более лучшее решение — включать мозг при проектировании API. К сожалению, для C++ уже всё потрачено, в него добавлено чудовищное количество граблей. Включая подобные описанным в посте — из-за того что написать код который скопирует объект проще чем код который НЕ скопирует, это самое копирование вылезает тут и там.


Замечу что в C такой проблемы бы не было, там бы transform принимал указатель на функцию и void* userdata, не имея проблем с полиморфизмом.

Не имя проблем с полиморфизмом и имея проблемы с void*.

C тоже имеет кучу проблем. Там где в C используется void* + функция, C++ может предложить более типобезопасный указатель/ссылку на объект.

Замечу что в C такой проблемы бы не было, там бы transform принимал указатель на функцию и void* userdata, не имея проблем с полиморфизмом.

«нет обобщенного программирования — нет проблем»?
Самое первое что в голову приходит — это std::ref. Прочитал заголовок, ожидал срыва покровов, думал мне расскажут почему его на самом деле нельзя использовать.
Интересно что я на этой неделе прочитал статью, а потом воспроизвел проблему и пока думал в чем дело — вспомнил про статью. Удивительное совпадение, правда C++11 поддержки не было, пришлось решать другим способом.
Я уже не вспомню, но там сложнее было найти причину проблемы чем починить. У меня был большой объект и я решил его добавить operator() для того чтобы использовать этот же объект со стейтом как функтор для алгоритма и оказалось что весь это большой объект копируется. По моему я просто сделал маленький объект с operator() для которого копирование это ок.
Sign up to leave a comment.