При таком подходе итераторы разыменовываются. к значению r. Кажется, это мешает работать таким алгоритмам, как std::sort() или std::reverse(), поскольку swap ожидает lvalue.
Есть ли способ позволить такому контейнеру работать с алгоритмами STL, при этом позволяя итераторам разыменовывать класс-оболочку вместо истинной ссылки (
Код: Выделить всё
&
Я пытался предоставить другу void iter_swap(iterator it1, iterator i2) в моем классе итератора (как здесь), но std::reverse/std::sort по-прежнему не работает. Я получаю сообщение об ошибке, связанное с созданием экземпляра std::iter_swap (а не предоставленного мной iter_swap). Обратите внимание, что использование std::iter_swap; iter_swap(a, b); работает.
Этот ответ предполагает, что можно выполнить настройку iter_swap на основе ADL использование стандартной библиотеки в принципе, известные в настоящее время реализации имеют очень ограниченную поддержку этого. Есть ли альтернатива, которую я могу использовать?
Обновление: Предоставление swap(Foo &&, Foo &&), где Foo — это «ссылочный тип» оболочки, позволяет этому работать. Что пойдет не так, если я воспользуюсь этим подходом?
Ссылки:
[*]Can iter_swap специализироваться?
[*]специализировать std::swap для rvalue (предлагает напрямую специализировать std::iter_swap, но насколько я понимаю, это рискованно?)
Подробнее здесь: https://stackoverflow.com/questions/787 ... er-class-i