std::experimental::ranges:: common_type
|
Definiert in Header
<experimental/ranges/type_traits>
|
||
|
template
<
class
...
T
>
struct common_type ; |
(ranges TS) | |
Bestimmt den gemeinsamen Typ aller Typen
T...
, also den Typ, in den alle
T...
implizit konvertiert werden können. Falls ein solcher Typ existiert (gemäß den nachfolgenden Regeln bestimmt), benennt das Mitglied
type
diesen Typ. Andernfalls existiert kein Mitglied
type
. Das Verhalten ist undefiniert, wenn einer der Typen in
T...
ein unvollständiger Typ ist, außer (möglicherweise cv-qualifiziertem)
void
.
-
Wenn
sizeof...
(
T
)
null ist, existiert kein Member
type. -
Wenn
sizeof...
(
T
)
eins beträgt (d.h.
T...enthält nur einen TypT0), bezeichnet der Membertypedenselben Typ wie std:: decay_t < T0 > . -
Wenn
sizeof...
(
T
)
zwei beträgt (d.h.
T...enthält genau zwei TypenT1undT2),
-
-
Wenn die Anwendung von
std::decay
auf mindestens einen der Typen
T1undT2einen anderen Typ ergibt, bezeichnet das Mitgliedtypedenselben Typ wie ranges :: common_type_t < std:: decay_t < T1 > , std:: decay_t < T2 >> , falls dieser existiert; andernfalls gibt es kein Mitgliedtype; -
Andernfalls (und sofern keine Benutzerspezialisierung für
ranges
::
common_type
<
T1, T2
>
vorliegt), falls
std::
common_type_t
<
T1, T2
>
wohlgeformt ist, dann bezeichnet das Mitglied
typediesen Typ; -
Andernfalls bezeichnet das Mitglied
typeden Typ std:: decay_t < decltype ( false ? std:: declval < const T1 & > ( ) : std:: declval < const T2 & > ( ) ) > , falls dieser bedingte Ausdruck wohlgeformt ist; andernfalls gibt es kein Mitgliedtype.
-
Wenn die Anwendung von
std::decay
auf mindestens einen der Typen
-
Wenn
sizeof...
(
T
)
größer als zwei ist (d.h.,
T...besteht aus den TypenT1, T2, R...), dann bezeichnet das Mitgliedtyperanges :: common_type_t < ranges :: common_type_t < T1, T2 > , R... > , falls ein solcher Typ existiert. In allen anderen Fällen gibt es kein Mitgliedtype.
Inhaltsverzeichnis |
Mitgliedertypen
| Name | Definition |
type
|
der gemeinsame Typ für alle
T...
|
Hilfstypen
|
template
<
class
...
T
>
using common_type_t = typename common_type < T... > :: type ; |
||
Spezialisierungen
Benutzer können
common_type
für die Typen
T1
und
T2
spezialisieren, falls
-
Mindestens einer von
T1undT2hängt von einem benutzerdefinierten Typ ab, und -
std::decay
ist eine Identitätstransformation für sowohl
T1als auchT2.
Falls eine solche Spezialisierung ein Mitglied namens
type
besitzt, muss es ein öffentlicher und eindeutiger Mitgliedstyp sein, der einen cv-unqualifizierten Nicht-Referenz-Typ benennt, in den sowohl
T1
als auch
T2
explizit konvertierbar sind. Zusätzlich müssen
ranges
::
common_type_t
<
T1, T2
>
und
ranges
::
common_type_t
<
T2, T1
>
denselben Typ bezeichnen.
Ein Programm, das
common_type
Spezialisierungen hinzufügt, die gegen diese Regeln verstoßen, hat undefiniertes Verhalten.
Hinweise
Für arithmetische Typen, die keiner Promotion unterliegen, kann der gemeinsame Typ als der Typ des (möglicherweise gemischt-modigen) arithmetischen Ausdrucks wie T0 ( ) + T1 ( ) + ... + Tn ( ) betrachtet werden.
Beispiel
|
Dieser Abschnitt ist unvollständig
Grund: Kein Beispiel |
Siehe auch
|
(C++11)
|
bestimmt den gemeinsamen Typ einer Gruppe von Typen
(Klassen-Template) |
|
bestimmt den gemeinsamen Referenztyp einer Menge von Typen
(Klassen-Template) |