Namespaces
Variants

std::experimental::ranges:: common_type

From cppreference.net
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 Typ T0 ), bezeichnet der Member type denselben Typ wie std:: decay_t < T0 > .
  • Wenn sizeof... ( T ) zwei beträgt (d.h. T... enthält genau zwei Typen T1 und T2 ),
  • Wenn die Anwendung von std::decay auf mindestens einen der Typen T1 und T2 einen anderen Typ ergibt, bezeichnet das Mitglied type denselben Typ wie ranges :: common_type_t < std:: decay_t < T1 > , std:: decay_t < T2 >> , falls dieser existiert; andernfalls gibt es kein Mitglied type ;
  • 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 type diesen Typ;
  • Andernfalls bezeichnet das Mitglied type den Typ std:: decay_t < decltype ( false ? std:: declval < const T1 & > ( ) : std:: declval < const T2 & > ( ) ) > , falls dieser bedingte Ausdruck wohlgeformt ist; andernfalls gibt es kein Mitglied type .
  • Wenn sizeof... ( T ) größer als zwei ist (d.h., T... besteht aus den Typen T1, T2, R... ), dann bezeichnet das Mitglied type ranges :: common_type_t < ranges :: common_type_t < T1, T2 > , R... > , falls ein solcher Typ existiert. In allen anderen Fällen gibt es kein Mitglied type .

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 T1 und T2 hängt von einem benutzerdefinierten Typ ab, und
  • std::decay ist eine Identitätstransformation für sowohl T1 als auch T2 .

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

Siehe auch

bestimmt den gemeinsamen Typ einer Gruppe von Typen
(Klassen-Template)
bestimmt den gemeinsamen Referenztyp einer Menge von Typen
(Klassen-Template)