Namespaces
Variants

std::experimental::ranges:: common_type

From cppreference.net
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 tipo T0 ), el miembro type denota el mismo tipo que std:: decay_t < T0 > .
  • Si sizeof... ( T ) es dos (es decir, T... contiene exactamente dos tipos T1 y T2 ),
  • Si aplicar std::decay a al menos uno de T1 y T2 produce un tipo diferente, el miembro type denota el mismo tipo que ranges :: common_type_t < std:: decay_t < T1 > , std:: decay_t < T2 >> , si existe; si no, no hay miembro type ;
  • 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 type denota ese tipo;
  • En caso contrario, el miembro type denota 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 miembro type .
  • Si sizeof... ( T ) es mayor que dos (es decir, T... consiste en los tipos T1, T2, R... ), entonces si ranges :: common_type_t < T1, T2 > existe, el miembro type denota ranges :: common_type_t < ranges :: common_type_t < T1, T2 > , R... > si tal tipo existe. En todos los demás casos, no existe el miembro type .

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 T1 y T2 depende de un tipo definido por el usuario, y
  • std::decay es una transformación identidad para ambos T1 y T2 .

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

Véase también

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)