¿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.
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
ystd::remove_reference
para deducir el tipo de valor del iterador. Aquí hay un ejemplo: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 usandostd::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.