Рефакторинг контейнеров. #30
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Недавно реализованные методы с семантикой перемещения сделаны с дублированием кода (пример
PIVector::push_back). Более удачное решение- оставить только вариант метода с Rvalue ссылкой. Для передачи вelementNewиспользоватьstd::forward<T>(v). См. "Краткое введение в rvalue-ссылки".Еще метод
resizeподдерживает только семантику копирования. А значит с помощью контейнеров невозможно работать с 'no copy' классами.С контейнерами в принципе нельзя допускать работу с ‘no copy’ классами, это ведёт к трудно отлавливаемым ошибкам, так что это только плюс, что их нельзя туда пихать.
Все ‘no copy’ классы нужно держать в контейнерах только по указателям.
Степ, для интереса попробуй выпилить из контейнеров операторы const &, а оставь только &&. И скомпиляй.
Причем, даже в std::vector есть два варианта:
void push_back(const value_type& __x)
#if __cplusplus >= 201103L
void push_back(value_type&& __x)
это тоже явно неспроста
Завтра по внимательнее гляну вывод, но мое мнение по контейнерам врядли изменится.
Там в контейнерах не совсем правильно реализованы методы с &&. Нужно в некоторых местах вместо
std::moveиспользоватьstd::forward. И кажется, дизайн классов не совсем готов к семантике перемещения.Сегодня переделал PIThreadPoolExecutor и PIBlockingDequeue. На сколько я успел убедиться, классы полностью поддерживают обе семантики. По идее, код, использующий эти классы, никак не должен меняться.
Завтра тоже гляну по внимательнее. Думаю, что они для лучшей скорости работы специализированную функцию оставили.
Вопрос на счет дублирования const & и && закрываю. Универсальные ссылки && работают только если template на уровне метода, а не на уровне класса.
Работа с no copy классами отклонена из- за несоответствия идеологии.