std::experimental::ranges:: common_type
|
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 typeT0), le membretypedésigne le même type que std:: decay_t < T0 > . -
Si
sizeof...
(
T
)
est deux (c'est-à-dire que
T...contient exactement deux typesT1etT2),
-
-
Si l'application de
std::decay
à au moins l'un des types
T1etT2produit un type différent, le membretypedé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 membretype; -
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
typedésigne ce type ; -
Sinon, le membre
typedé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 membretype.
-
Si l'application de
std::decay
à au moins l'un des types
-
Si
sizeof...
(
T
)
est supérieur à deux (c'est-à-dire,
T...consiste en les typesT1, T2, R...), alors si ranges :: common_type_t < T1, T2 > existe, le membretypedé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 membretype.
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
T1etT2dépend d'un type défini par l'utilisateur, et -
std::decay
est une transformation identitaire pour les deux
T1etT2.
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
|
Cette section est incomplète
Raison : aucun exemple |
Voir aussi
|
(C++11)
|
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) |