std::experimental::ranges:: common_reference
|
Definido en el encabezado
<experimental/ranges/type_traits>
|
||
|
template
<
class
...
T
>
struct common_reference ; |
(ranges TS) | |
Determina el tipo de referencia común de los tipos
T...
, es decir, el tipo al que todos los tipos en
T...
pueden ser convertidos o vinculados. Si existe tal tipo (determinado de acuerdo con las reglas siguientes), el miembro
type
nombra ese tipo. De lo contrario, no existe el miembro
type
. El comportamiento es indefinido si alguno de los tipos en
T...
es un tipo incompleto distinto de (posiblemente calificado cv)
void
.
Cuando se proporcionan tipos de referencia,
common_reference
intenta encontrar un tipo de referencia al que todos los tipos de referencia suministrados puedan enlazarse, pero puede devolver un tipo no referencia si no puede encontrar dicho tipo de referencia.
-
Si
sizeof...
(
T
)
es cero, no existe el miembro
type. -
Si
sizeof...
(
T
)
es uno (es decir,
T...contiene solo un tipoT0), el miembrotypedenomina el mismo tipo que T0 . -
Si
sizeof...
(
T
)
es dos (es decir,
T...contiene dos tiposT1yT2):-
Si
T1yT2son ambos tipos referencia, y existe el tipo de referencia común simpleSdeT1yT2(según se define a continuación), entonces el tipo miembrotypedenominaS; -
En caso contrario, si existe
basic_common_reference
<
T1R, T2R, T1Q, T2Q
>
::
type
, donde
TiRes std:: remove_cv_t < std:: remove_reference_t < Ti >> yTiQes una plantilla de alias tal que TiQ < TiR > es Ti , entonces el tipo miembrotypedenomina ese tipo; -
En caso contrario, si
decltype
(
false
?
val
<
T1
>
(
)
:
val
<
T2
>
(
)
)
, donde
vales una plantilla de función template < class T > T val ( ) ; , denota un tipo válido, entonces el tipo miembrotypedenomina ese tipo; -
En caso contrario, si
ranges::
common_type_t
<
T1, T2
>
es un tipo válido, entonces el tipo miembro
typedenomina ese tipo; - En caso contrario, no existe el tipo miembro.
-
Si
-
Si
sizeof...
(
T
)
es mayor que dos (es decir,
T...consiste en los tiposT1, T2, R...), entonces si existe ranges :: common_reference_t < T1, T2 > , el miembrotypedenota ranges :: common_reference_t < ranges :: common_reference_t < T1, T2 > , R... > si existe tal tipo. En todos los demás casos, no existe el miembrotype.
El
tipo de referencia común simple
de dos tipos de referencia
T1
y
T2
se define de la siguiente manera:
-
Si
T1escv1 X &yT2escv2 Y &(es decir, ambos son tipos de referencia lvalue): su tipo de referencia común simple es decltype ( false ? std:: declval < cv12 X & > ( ) : std:: declval < cv12 Y & > ( ) ) , donde cv12 es la unión de cv1 y cv2 , si ese tipo existe y es un tipo de referencia. -
Si
T1yT2son ambos tipos de referencia rvalue: si existe el tipo de referencia común simple deT1 &yT2 &(determinado según el punto anterior), entonces seaCel tipo de referencia rvalue correspondiente a ese tipo. Si std:: is_convertible < T1, C > :: value y std:: is_convertible < T2, C > :: value son ambostrue, entonces el tipo de referencia común simple deT1yT2esC. -
De lo contrario, uno de los dos tipos debe ser un tipo de referencia lvalue
A &y el otro debe ser un tipo de referencia rvalueB &&(AyBpueden estar calificados con cv). SeaDel tipo de referencia común simple de A & y B const & , si existe. Si D existe y std:: is_convertible < B && , D > :: value estrue, entonces el tipo de referencia común simple esD. - De lo contrario, no existe un tipo de referencia común simple.
Contenidos |
Tipos de miembros
| Nombre | Definición |
type
|
el tipo de referencia común para todos
T...
|
Tipos auxiliares
|
template
<
class
...
T
>
using common_reference_t = typename common_reference < T... > :: type ; |
||
|
template
<
class
T,
class
U,
template
<
class
>
class
TQual,
template
<
class
>
class
UQual
>
struct basic_common_reference { } ; |
||
La plantilla de clase
basic_common_reference
es un punto de personalización que permite a los usuarios influir en el resultado de
common_reference
para tipos definidos por el usuario (típicamente referencias proxy). La plantilla principal está vacía.
Especializaciones
Un programa puede especializar
basic_common_reference<T, U, TQual, UQual>
en los dos primeros parámetros
T
y
U
si
std::
is_same
<
T,
std::
decay_t
<
T
>>
y
std::
is_same
<
U,
std::
decay_t
<
U
>>
son ambos verdaderos y al menos uno de ellos depende de un tipo definido por el programa.
Si tal especialización tiene un miembro llamado
type
, debe ser un tipo de miembro público y no ambiguo que nombre un tipo al cual tanto
TQual
<
T
>
como
UQual
<
U
>
sean convertibles. Adicionalmente,
ranges
::
basic_common_reference
<
T, U, TQual, UQual
>
::
type
y
ranges
::
basic_common_reference
<
U, T, UQual, TQual
>
::
type
deben denotar el mismo tipo.
Un programa no puede especializar
basic_common_reference
en el tercer o cuarto parámetro, ni puede especializar
common_reference
mismo. Un programa que añade especializaciones violando estas reglas tiene comportamiento indefinido.
Notas
| Esta sección está incompleta |
Ejemplo
|
Esta sección está incompleta
Razón: sin ejemplo |
Véase también
|
(C++11)
|
determina el tipo común de un grupo de tipos
(plantilla de clase) |
|
determina el tipo común de un conjunto de tipos
(plantilla de clase) |
|
|
especifica que dos tipos comparten un tipo de referencia común
(concepto) |