Namespaces
Variants

std::experimental::ranges:: common_type

From cppreference.net
Défini dans l'en-tête <experimental/ranges/type_traits>
template < class ... T >
struct common_type ;
(ranges TS)

Détermine le type commun parmi tous les types T... , c'est-à-dire le type vers lequel tous les T... peuvent être implicitement convertis. Si un tel type existe (tel que déterminé selon les règles ci-dessous), le membre type nomme ce type. Sinon, il n'y a pas de membre type . Le comportement est indéfini si l'un des types dans T... est un type incomplet autre que (éventuellement qualifié cv) void .

  • Si sizeof... ( T ) est zéro, il n'y a pas de membre type .
  • Si sizeof... ( T ) est un (c'est-à-dire que T... contient seulement un type T0 ), le membre type désigne le même type que std:: decay_t < T0 > .
  • Si sizeof... ( T ) est deux (c'est-à-dire que T... contient exactement deux types T1 et T2 ),
  • Si l'application de std::decay à au moins l'un des types T1 et T2 produit un type différent, le membre type désigne le même type que ranges :: common_type_t < std:: decay_t < T1 > , std:: decay_t < T2 >> , s'il existe ; sinon, il n'y a pas de membre type ;
  • Sinon, (et sauf s'il existe une spécialisation utilisateur pour ranges :: common_type < T1, T2 > ), si std:: common_type_t < T1, T2 > est bien formé, alors le membre type désigne ce type ;
  • Sinon, le membre type désigne le type std:: decay_t < decltype ( false ? std:: declval < const T1 & > ( ) : std:: declval < const T2 & > ( ) ) > , si cette expression conditionnelle est bien formée ; sinon, il n'y a pas de membre type .
  • Si sizeof... ( T ) est supérieur à deux (c'est-à-dire, T... consiste en les types T1, T2, R... ), alors si ranges :: common_type_t < T1, T2 > existe, le membre type dénote ranges :: common_type_t < ranges :: common_type_t < T1, T2 > , R... > si un tel type existe. Dans tous les autres cas, il n'y a pas de membre type .

Table des matières

Types membres

Nom Définition
type le type commun pour tous les T...

Types auxiliaires

template < class ... T >
using common_type_t = typename common_type < T... > :: type ;

Spécialisations

Les utilisateurs peuvent spécialiser common_type pour les types T1 et T2 si

  • Au moins l'un des T1 et T2 dépend d'un type défini par l'utilisateur, et
  • std::decay est une transformation identitaire pour les deux T1 et T2 .

Si une telle spécialisation possède un membre nommé type , celui-ci doit être un type membre public et non ambigu qui désigne un type non référence sans qualificatif cv vers lequel T1 et T2 sont explicitement convertibles. De plus, ranges :: common_type_t < T1, T2 > et ranges :: common_type_t < T2, T1 > doivent désigner le même type.

Un programme qui ajoute des spécialisations de common_type en violation de ces règles a un comportement indéfini.

Notes

Pour les types arithmétiques non soumis à la promotion, le type commun peut être considéré comme le type de l'expression arithmétique (éventuellement en mode mixte) telle que T0 ( ) + T1 ( ) + ... + Tn ( ) .

Exemple

Voir aussi

détermine le type commun d'un groupe de types
(modèle de classe)
détermine le type de référence commun d'un ensemble de types
(modèle de classe)