Namensräume
Varianten
Aktionen

std::experimental::ranges::common_type

Von cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
 
 
Allgemeine Dienstprogramme-Bibliothek
Hilfskomponenten
Funktionsobjekte
Metaprogrammierung und Typ-Traits
common_type
Getaggte Paare und Tupel
                          
Tag-Spezifizierer
                                      
                          
 
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 Typ T0), benennt das Member type denselben Typ wie std::decay_t<T0>.
  • Wenn sizeof...(T) zwei ist (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, benennt das Member type denselben Typ wie ranges::common_type_t<std::decay_t<T1>, std::decay_t<T2>>, falls dieser existiert; andernfalls gibt es kein Member type;
  • 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 type diesen Typ;
  • Andernfalls bezeichnet das Member type den 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 Member type.
  • Wenn sizeof...(T) größer als zwei ist (d.h. T... besteht aus den Typen T1, T2, R...), dann, wenn ranges::common_type_t<T1, T2> existiert, bezeichnet das Member 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 Member type.

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 T1 und T2 von einem benutzerdefinierten Typ abhängt und
  • std::decay für beide Typen T1 und T2 eine 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

[bearbeiten] See also

ermittelt den gemeinsamen Typ einer Gruppe von Typen
(Klassenvorlage) [bearbeiten]
ermittelt den gemeinsamen Referenztyp einer Menge von Typen
(class template) [bearbeiten]