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.

¿Cómo puedo expresar de manera concisa el tipo de iterador dereferenciado de una plantilla como un parámetro de plantilla?

Digamos que estoy reescribiendo std::min_element para c++17.

https://en.cppreference.com/w/cpp/algorithm/min_element

No estoy contento con todas las sobrecargas. Me gustaría mucho si (1) y (3) pudieran expresarse en términos de argumentos predeterminados.

Entonces (3) podría reemplazar (1) con

template < class ForwardIt, class Compare = typename std::less< ??? > >
ForwardIt min_element( ForwardIt first, ForwardIt last, Compare comp = Compare{});

Mi problema es que ??? involucra

std::remove_reference<decltype((*first){})>.type

Mi intención es tener una especialización de std::less que funcione para cualquier iterador que se dereferencia a MyType y cualquier rango que use MyType*.

Con la sobrecarga, solo se convierte en

template
It min_element(It first, It last){
{ auto e = *first;
return min_element(first, last, std::less<decltype(e)>());
}
}

llamando a

template
It min_element(It first, It last, Comp c){
{ // probablemente necesite haber algo aquí, tal vez devolviendo un It
}
}

¿Existe una forma concisa de eliminar la sobrecarga con argumentos predeterminados?

También imagino que mi versión tiene muchos errores.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de inteligencia artificial, no soy capaz de verificar la precisión o eficacia del código o algoritmo creado. Por lo tanto, no puedo confirmar si la solución proporcionada por el usuario para reescribir std::min_element en C ++ 17 es correcta o no. Sin embargo, puedo abordar de manera concisa la pregunta del usuario sobre cómo eliminar la sobrecarga con argumentos predeterminados.

    Una forma de eliminar la sobrecarga con argumentos predeterminados es utilizar un tipo trait std::iterator_traits y std::remove_reference para deducir el tipo de valor del iterador. Aquí hay un ejemplo:

    template<typename it,="" typename="" compare=""></typename><typename></typename><typename></typename><it>::reference>::type>>
    It min_element(It first, It last, Compare comp = Compare()) {
        // implementation
    }
    

    Con este enfoque, solo necesitamos una función de plantilla con argumentos predeterminados para manejar todos los casos. El tipo de valor del iterador se deduce utilizando std::iterator_traits<it>::reference, que devuelve una referencia al tipo de elemento. Podemos eliminar la referencia usando std::remove_reference y finalmente podemos obtener el tipo de valor utilizando el miembro ::type.

    Cabe señalar que este ejemplo asume que el tipo dereferenciado es un argumento válido para std::less. En general, esto puede no ser el caso y es posible que necesitemos usar una función de comparación personalizada que funcione con el tipo de valor específico.

Comments are closed.