std::experimental::ranges:: common_type
|
Definido en el encabezado
<experimental/ranges/type_traits>
|
||
|
template
<
class
...
T
>
struct common_type ; |
(ranges TS) | |
Determina el tipo común entre todos los tipos
T...
, es decir, el tipo al que todos los
T...
pueden convertirse implícitamente. Si existe tal tipo (determinado según 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
.
-
Si
sizeof...
(
T
)
es cero, no existe el miembro
type. -
Si
sizeof...
(
T
)
es uno (es decir,
T...contiene solo un tipoT0), el miembrotypedenota el mismo tipo que std:: decay_t < T0 > . -
Si
sizeof...
(
T
)
es dos (es decir,
T...contiene exactamente dos tiposT1yT2),
-
-
Si aplicar
std::decay
a al menos uno de
T1yT2produce un tipo diferente, el miembrotypedenota el mismo tipo que ranges :: common_type_t < std:: decay_t < T1 > , std:: decay_t < T2 >> , si existe; si no, no hay miembrotype; -
En caso contrario, (y a menos que exista una especialización de usuario para
ranges
::
common_type
<
T1, T2
>
), si
std::
common_type_t
<
T1, T2
>
está bien formado, entonces el miembro
typedenota ese tipo; -
En caso contrario, el miembro
typedenota el tipo std:: decay_t < decltype ( false ? std:: declval < const T1 & > ( ) : std:: declval < const T2 & > ( ) ) > , si esa expresión condicional está bien formada; si no, no hay miembrotype.
-
Si aplicar
std::decay
a al menos uno de
-
Si
sizeof...
(
T
)
es mayor que dos (es decir,
T...consiste en los tiposT1, T2, R...), entonces si ranges :: common_type_t < T1, T2 > existe, el miembrotypedenota ranges :: common_type_t < ranges :: common_type_t < T1, T2 > , R... > si tal tipo existe. En todos los demás casos, no existe el miembrotype.
Contenidos |
Tipos de miembros
| Nombre | Definición |
type
|
el tipo común para todos
T...
|
Tipos auxiliares
|
template
<
class
...
T
>
using common_type_t = typename common_type < T... > :: type ; |
||
Especializaciones
Los usuarios pueden especializar
common_type
para los tipos
T1
y
T2
si
-
Al menos uno de
T1yT2depende de un tipo definido por el usuario, y -
std::decay
es una transformación identidad para ambos
T1yT2.
Si tal especialización tiene un miembro llamado
type
, debe ser un tipo de miembro público y no ambiguo que nombre un tipo no calificado cv y no referencia al cual tanto
T1
como
T2
sean explícitamente convertibles. Adicionalmente,
ranges
::
common_type_t
<
T1, T2
>
y
ranges
::
common_type_t
<
T2, T1
>
deben denotar el mismo tipo.
Un programa que añade
common_type
especializaciones en violación de estas reglas tiene comportamiento indefinido.
Notas
Para tipos aritméticos no sujetos a promoción, el tipo común puede verse como el tipo de la expresión aritmética (posiblemente de modo mixto) como T0 ( ) + T1 ( ) + ... + Tn ( ) .
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 de referencia común de un conjunto de tipos
(plantilla de clase) |