Espacios de nombres
Variantes
Acciones

std::compare_three_way

De cppreference.com
< cpp‎ | utility
 
 
Biblioteca de servicios
 
Objetos función
Envoltorios de funciones
(C++11)
(C++11)
Aplicación parcial de funciones
(C++20)
(C++11)
Invocación de funciones
(C++17)(C++23)
Objeto función identidad
(C++20)
Envoltorios de referencias
(C++11)(C++11)
Envoltorios de operador transparentes
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
Negadores
(C++17)
Buscadores
Comparadores restringidos
compare_three_way
(C++20)
Vinculadores y adaptadores antiguos
(hasta C++17)
(hasta C++17)
(hasta C++17)
(hasta C++17)
(hasta C++17)(hasta C++17)(hasta C++17)(hasta C++17)
(hasta C++20)
(hasta C++20)
(hasta C++17)(hasta C++17)
(hasta C++17)(hasta C++17)

(hasta C++17)
(hasta C++17)(hasta C++17)(hasta C++17)(hasta C++17)
(hasta C++20)
(hasta C++20)
 
Definido en el archivo de encabezado <compare>
Definido en el archivo de encabezado <functional>
struct compare_three_way;
(desde C++20)

Objeto función para realizar comparaciones. Deduce los tipos de parámetros y el tipo de retorno del operador de llamada a función.

Contenido

[editar]Tipos miembro

Tipo miembro Definición
is_transparent /* no especificado */

[editar]Funciones miembro

operator()
Obtiene el resultado de la comparación de tres vías sobre ambos argumentos.
(función miembro pública)

std::compare_three_way::operator()

template<class T, class U>

    requires std::three_way_comparable_with<T, U>||
             /* std::declval<T>() <=> std::declval<U>() se resuelve en
                un operador integrado que compara punteros */

constexprauto operator()(T&& t, U&& u)const;

Compara t y u. Equivalente a returnstd::forward<T>(t)<=>std::forward<U>(u);, excepto cuando esa expresión se resuelve en una llamada a un operador integrado, operator<=>, que compara punteros.

Cuando una llamada invocaría un operador integrado que compara punteros de tipo P, en su lugar el resultado se determina de la siguiente manera:

  • Devuelve std::strong_ordering::less si el valor (posiblemente convertido) del primer argumento precede al valor (posiblemente convertido) del segundo argumento en el ordenamiento total estricto definido por la implementación sobre todos los valores de puntero de tipo P. Este ordenamiento estricto total es consistente con el orden parcial impuesto por los operadores integrados <, >, <=, y >=.
  • De lo contrario, devuelve std::strong_ordering::greater si el valor (posiblemente convertido) del segundo argumento precede al valor (posiblemente convertido) del primer argumento en el mismo ordenamiento estricto total.
  • De lo contrario, devuelve std::strong_ordering::equal.

El comportamiento no está definido a menos que las secuencias de conversión tanto de T como de U para P sean conservadoras de igualdad (véase más abajo).

[editar]Conservación de la igualdad

Una expresión es conservadora de igualdad si resulta en salidas iguales dadas entradas iguales.

  • Las entradas de una expresión consisten en sus operandos.
  • Las salidas de una expresión consisten en su resultado y todos los operandos modificados por la expresión (si es que los hay).

Cada expresión que se requiere sea conservadora de igualdad, se requiere además que sea estable: dos evaluaciones de tal expresión con los mismos objetos de entrada debe tener salidas iguales si no se encuentra alguna modificación interventora de esos objetos de entrada.

[editar]Ejemplo

#include <iostream>#include <compare>   struct Racional {// número racionalint num;// numeradorint den;// denominador; > 0   // Aunque la comparación X <=> Y funcionará, una llamada directa// a std::compare_three_way{}(X,Y) requiere que operator==// esté definido para satisfacer a std::three_way_comparable_with.constexprbool operator==(Racional const&)const=default;};   constexprstd::weak_ordering operator<=>(Racional lhs, Racional rhs){return lhs.num* rhs.den<=> rhs.num* lhs.den;}   void imprimir(std::weak_ordering valor){ valor <0?std::cout<<"menor\n": valor >0?std::cout<<"mayor\n":std::cout<<"igual\n";}   int main(){ Racional a{6,5}; Racional b{8,7}; imprimir(a <=> b); imprimir(std::compare_three_way{}(a,b));}

Salida:

mayor mayor

[editar]Véase también

Objeto función que implementa x == y.
(clase)[editar]
Objeto función que implementa x != y.
(clase)[editar]
Objeto función que implementa x < y.
(clase)[editar]
Objeto función que implementa x > y.
(clase)[editar]
Objeto función que implementa x <= y.
(clase)[editar]
Objeto función que implementa x >= y.
(clase)[editar]
close