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..., d.h. den Typ, zu dem alle T... implizit konvertiert werden können. Wenn ein solcher Typ existiert (wie nach den folgenden Regeln bestimmt), benennt das Member type diesen Typ. Andernfalls gibt es kein Member type. Das Verhalten ist undefiniert, wenn einer der Typen in T... ein unvollständiger Typ ist, außer (möglicherweise cv-qualifiziert) void.
- Wenn sizeof...(T) null ist, gibt es kein Element
type. - Wenn sizeof...(T) eins ist (d.h.
T...enthält nur einen TypT0), benennt das Membertypedenselben Typ wie std::decay_t<T0>. - Wenn sizeof...(T) zwei ist (d.h.
T...enthält genau zwei TypenT1undT2),
- Wenn die Anwendung von std::decay auf mindestens einen der Typen
T1undT2einen anderen Typ ergibt, benennt das Membertypedenselben Typ wie ranges::common_type_t<std::decay_t<T1>, std::decay_t<T2>>, falls dieser existiert; andernfalls gibt es kein Membertype; - Andernfalls (und es sei denn, es gibt eine Benutzerspezialisierung für ranges::common_type<T1, T2>), wenn std::common_type_t<T1, T2> gut geformt ist, dann bezeichnet das Member
typediesen Typ; - Andernfalls bezeichnet das Member
typeden Typ std::decay_t<decltype(false ? std::declval<const T1&>() : std::declval<const T2&>())>, wenn dieser bedingte Ausdruck gut geformt ist; andernfalls gibt es kein Membertype.
- 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, wenn ranges::common_type_t<T1, T2> existiert, bezeichnet das Membertyperanges::common_type_t<ranges::common_type_t<T1, T2>, R...>, falls ein solcher Typ existiert. In allen anderen Fällen gibt es kein Membertype.
Inhalt |
[bearbeiten] Member types
| Name | Definition |
type
|
der gemeinsame Typ für alle T... |
[bearbeiten] Helper types
| template< class... T > using common_type_t = typename common_type<T...>::type; |
||
[bearbeiten] Specializations
Benutzer können common_type für die Typen T1 und T2 spezialisieren, wenn
- Mindestens einer der Typen
T1undT2von einem benutzerdefinierten Typ abhängt und - std::decay für beide Typen
T1undT2eine Identitätstransformation ist.
Wenn eine solche Spezialisierung ein Member namens type hat, muss dieser ein öffentlicher und eindeutiger Member-Typ sein, der einen cv-unqualifizierten Nicht-Referenztyp benennt, zu dem 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 unter Verstoß gegen diese Regeln hinzufügt, hat undefiniertes Verhalten.
[bearbeiten] Notes
Für arithmetische Typen, die keiner Promotion unterliegen, kann der gemeinsame Typ als der Typ des (möglicherweise gemischten) arithmetischen Ausdrucks wie z. B. T0() + T1() + ... + Tn() angesehen werden.
[bearbeiten] Example
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] See also
| (C++11) |
ermittelt den gemeinsamen Typ einer Gruppe von Typen (Klassenvorlage) |
| ermittelt den gemeinsamen Referenztyp einer Menge von Typen (class template) |