es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El std::ranges::sort no utiliza el amigo oculto std::iter_swap.

Estoy escribiendo un iterador de proxy usando Boost.STLInterfaces. Tiene una función amiga en línea
friend constexpr void iter_swap(iter lhs, iter rhs) noexcept.
ranges::sort requiere, entre otras cosas, std::indirectly_swappable, que requiere ranges::iter_swap para el iterador. Pero con gcc-11.2.0 la pila de llamadas se ve algo así
“`
1 my::swap item.hpp 91<br>
2 std::iter<em>swap<my::iter, my::iter> stl</em>algobase.h 182
3 std::<strong>move<em>median</em>to<em>first<…> stl</em>algo.h 92<br>
4 std::</strong>unguarded<em>partition</em>pivot<…> stl<em>algo.h 1904
5 std::<strong>introsort</strong></em>loop<…> stl<em>algo.h 1938
6 std::sort<…> stl</em>algo.h 1954
7 std::sort<…> stl<em>algo.h 4875
8 std::ranges::<strong>sort</strong></em>fn::operator()<…> ranges<em>algo.h 2029
9 std::ranges::sort</em>fn::operator()<…> ranges_algo.h 2040
10 operator() sort.cpp 68<br>
11 main sort.cpp 82

<code>
es decir, ranges::sort llama a std::sort, que no utiliza la personalización, pero llama explícitamente a</code>std::iter_swap“` . Aún funciona gracias al intercambio amigo oculto para el tipo de referencia, sin embargo.

¿Qué se necesita para asegurarse de que ranges::sort use la personalización?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para asegurarse de que ranges::sort utiliza la personalización, es necesario definir una especialización del algoritmo std::ranges::iter_swap para su tipo de iterador. Esto se puede hacer mediante la definición de una nueva función con la siguiente firma:

    template <typename Iter1, typename Iter2>
    void iter_swap(my::iter<Iter1> lhs, my::iter<Iter2> rhs) noexcept
    {
        // Implementación
    }
    

    Esta función debe proporcionar una implementación personalizada del algoritmo iter_swap que funcione específicamente en su tipo de iterador. Una vez que se define esta función, ranges::sort la recogerá automáticamente y la utilizará en lugar del algoritmo estándar std::iter_swap.

Comments are closed.