std::experimental::ranges:: common_reference
|
Défini dans l'en-tête
<experimental/ranges/type_traits>
|
||
|
template
<
class
...
T
>
struct common_reference ; |
(ranges TS) | |
Détermine le type de référence commun des types
T...
, c'est-à-dire le type vers lequel tous les types dans
T...
peuvent être convertis ou liés. 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
.
Lorsqu'on lui donne des types référence,
common_reference
tente de trouver un type référence auquel tous les types référence fournis peuvent être liés, mais peut retourner un type non-référence s'il ne parvient pas à trouver un tel type référence.
-
Si
sizeof...
(
T
)
est zéro, il n'y a pas de membre
type. -
Si
sizeof...
(
T
)
est un (c'est-à-dire,
T...contient seulement un typeT0), le membretypedésigne le même type que T0 . -
Si
sizeof...
(
T
)
est deux (c'est-à-dire,
T...contient deux typesT1etT2):-
Si
T1etT2sont tous deux des types référence, et que le type référence commun simpleSdeT1etT2(tel que défini ci-dessous) existe, alors le membre typetypedésigneS; -
Sinon, si
basic_common_reference
<
T1R, T2R, T1Q, T2Q
>
::
type
existe, où
TiRest std:: remove_cv_t < std:: remove_reference_t < Ti >> etTiQest un alias template tel que TiQ < TiR > est Ti , alors le membre typetypedésigne ce type ; -
Sinon, si
decltype
(
false
?
val
<
T1
>
(
)
:
val
<
T2
>
(
)
)
, où
valest un template de fonction template < class T > T val ( ) ; , dénote un type valide, alors le membre typetypedésigne ce type ; -
Sinon, si
ranges::
common_type_t
<
T1, T2
>
est un type valide, alors le membre type
typedésigne ce type ; - Sinon, il n'y a pas de membre type.
-
Si
-
Si
sizeof...
(
T
)
est supérieur à deux (c'est-à-dire,
T...est constitué des typesT1, T2, R...), alors si ranges :: common_reference_t < T1, T2 > existe, le membretypedénote ranges :: common_reference_t < ranges :: common_reference_t < T1, T2 > , R... > si un tel type existe. Dans tous les autres cas, il n'y a pas de membretype.
Le
type de référence commun simple
de deux types de référence
T1
et
T2
est défini comme suit :
-
Si
T1estcv1 X &etT2estcv2 Y &(c'est-à-dire que les deux sont des types de référence lvalue) : leur type de référence commun simple est decltype ( false ? std:: declval < cv12 X & > ( ) : std:: declval < cv12 Y & > ( ) ) , où cv12 est l'union de cv1 et cv2 , si ce type existe et est un type référence. -
Si
T1etT2sont tous deux des types de référence rvalue : si le type de référence commun simple deT1 &etT2 &(déterminé selon le point précédent) existe, alors soitCle type de référence rvalue correspondant à ce type. Si std:: is_convertible < T1, C > :: value et std:: is_convertible < T2, C > :: value sont tous deuxtrue, alors le type de référence commun simple deT1etT2estC. -
Sinon, l'un des deux types doit être un type de référence lvalue
A &et l'autre doit être un type de référence rvalueB &&(AetBpeuvent être qualifiés cv). SoitDle type de référence commun simple de A & et B const & , s'il existe. Si D existe et std:: is_convertible < B && , D > :: value esttrue, alors le type de référence commun simple estD. - Sinon, il n'y a pas de type de référence commun simple.
Table des matières |
Types membres
| Nom | Définition |
type
|
le type de référence commun pour tous les
T...
|
Types auxiliaires
|
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 { } ; |
||
Le modèle de classe
basic_common_reference
est un point de personnalisation qui permet aux utilisateurs d'influencer le résultat de
common_reference
pour les types définis par l'utilisateur (généralement des références proxy). Le modèle principal est vide.
Spécialisations
Un programme peut spécialiser
basic_common_reference<T, U, TQual, UQual>
sur les deux premiers paramètres
T
et
U
si
std::
is_same
<
T,
std::
decay_t
<
T
>>
et
std::
is_same
<
U,
std::
decay_t
<
U
>>
sont tous deux vrais et qu'au moins l'un d'entre eux dépend d'un type défini par le programme.
Si une telle spécialisation possède un membre nommé
type
, il doit s'agir d'un type de membre public et non ambigu qui désigne un type vers lequel
TQual
<
T
>
et
UQual
<
U
>
sont convertibles. De plus,
ranges
::
basic_common_reference
<
T, U, TQual, UQual
>
::
type
et
ranges
::
basic_common_reference
<
U, T, UQual, TQual
>
::
type
doivent désigner le même type.
Un programme ne peut pas spécialiser
basic_common_reference
sur les troisième ou quatrième paramètres, ni spécialiser
common_reference
lui-même. Un programme qui ajoute des spécialisations en violation de ces règles a un comportement indéfini.
Notes
| Cette section est incomplète |
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 commun d'un ensemble de types
(modèle de classe) |
|
|
spécifie que deux types partagent un type de référence commun
(concept) |