std::experimental::ranges::common_reference
| Definiert in Header <experimental/ranges/type_traits> |
||
| template< class... T > struct common_reference; |
(Ranges TS) | |
Bestimmt den gemeinsamen Referenztyp der Typen T..., d. h. den Typ, in den alle Typen in T... konvertiert oder an den sie gebunden werden können. Wenn ein solcher Typ existiert (wie nach den untenstehenden Regeln bestimmt), benennt das Mitglied type diesen Typ. Andernfalls gibt es kein Mitglied type. Das Verhalten ist undefiniert, wenn einer der Typen in T... ein unvollständiger Typ ist, außer (möglicherweise cv-qualifiziertes) void.
Wenn Referenztypen gegeben sind, versucht common_reference, einen Referenztyp zu finden, an den alle gegebenen Referenztypen gebunden werden können, kann aber einen Nicht-Referenztyp zurückgeben, wenn kein solcher Referenztyp gefunden werden kann.
- Wenn sizeof...(T) null ist, gibt es kein Element
type. - Wenn sizeof...(T) eins ist (d. h.
T...enthält nur einen TypT0), dann benennt das Mitgliedtypedenselben Typ wie T0. - Wenn sizeof...(T) zwei ist (d. h.
T...enthält zwei TypenT1undT2)- Wenn
T1undT2beide Referenztypen sind und der *einfache gemeinsame Referenztyp*SvonT1undT2(wie unten definiert) existiert, dann benennt der MitgliedstyptypeS; - Andernfalls, wenn basic_common_reference<T1R, T2R, T1Q, T2Q>::type existiert, wobei
TiRstd::remove_cv_t<std::remove_reference_t<Ti>> ist undTiQeine Alias-Vorlage ist, so dass TiQ<TiR> gleich Ti ist, dann benennt der Mitgliedstyptypediesen Typ; - Andernfalls, wenn decltype(false? val<T1>() : val<T2>()), wobei
valeine Funktionenschablone ist template<class T> T val();, einen gültigen Typ bezeichnet, dann benennt der Mitgliedstyptypediesen Typ; - Andernfalls, wenn ranges::common_type_t<T1, T2> ein gültiger Typ ist, dann benennt der Mitgliedstyp
typediesen Typ; - Andernfalls gibt es keinen Mitgliedstyp.
- Wenn
- Wenn sizeof...(T) größer als zwei ist (d. h.
T...besteht aus den TypenT1, T2, R...), dann, wenn ranges::common_reference_t<T1, T2> existiert, bezeichnet das Mitgliedtyperanges::common_reference_t<ranges::common_reference_t<T1, T2>, R...>, falls ein solcher Typ existiert. In allen anderen Fällen gibt es kein Mitgliedtype.
Der *einfache gemeinsame Referenztyp* von zwei Referenztypen T1 und T2 ist wie folgt definiert:
- Wenn
T1cv1 X &ist undT2cv2 Y &ist (d. h. beide sind lvalue-Referenztypen): ihr einfacher gemeinsamer Referenztyp ist decltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>()), wobei cv12 die Vereinigung von cv1 und cv2 ist, falls dieser Typ existiert und ein Referenztyp ist. - Wenn
T1undT2beide rvalue-Referenztypen sind: wenn der einfache gemeinsame Referenztyp vonT1 &undT2 &(bestimmt gemäß dem vorherigen Punkt) existiert, dann seiCder entsprechende rvalue-Referenztyp dieses Typs. Wenn std::is_convertible<T1, C>::value und std::is_convertible<T2, C>::value beidetruesind, dann ist der einfache gemeinsame Referenztyp vonT1undT2C. - Andernfalls muss einer der beiden Typen ein lvalue-Referenztyp
A &und der andere ein rvalue-ReferenztypB &&sein (AundBkönnen cv-qualifiziert sein). SeiDder einfache gemeinsame Referenztyp von A & und B const &, falls vorhanden. Wenn D existiert und std::is_convertible<B &&, D>::valuetrueist, dann ist der einfache gemeinsame ReferenztypD. - Andernfalls gibt es keinen einfachen gemeinsamen Referenztyp.
Inhalt |
[bearbeiten] Mitgliedstypen
| Name | Definition |
type
|
der gemeinsame Referenztyp für alle T... |
[bearbeiten] Hilfstypen
| 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 {}; |
||
Die Klassenschablone basic_common_reference ist ein Anpassungspunkt, der es Benutzern ermöglicht, das Ergebnis von common_reference für benutzerdefinierte Typen (typischerweise Proxy-Referenzen) zu beeinflussen. Die Primärschablone ist leer.
[bearbeiten] Spezialisierungen
Ein Programm kann basic_common_reference<T, U, TQual, UQual> auf die ersten beiden Parameter T und U spezialisieren, wenn std::is_same<T, std::decay_t<T>> und std::is_same<U, std::decay_t<U>> beide true sind und mindestens einer von ihnen von einem programmintern definierten Typ abhängt.
Wenn eine solche Spezialisierung ein Mitglied namens type hat, muss es ein öffentliches und eindeutiges Mitglied sein, das einen Typ benennt, zu dem sowohl TQual<T> als auch UQual<U> konvertierbar sind. Zusätzlich müssen ranges::basic_common_reference<T, U, TQual, UQual>::type und ranges::basic_common_reference<U, T, UQual, TQual>::type denselben Typ bezeichnen.
Ein Programm darf basic_common_reference nicht auf den dritten oder vierten Parametern spezialisieren, noch darf es common_reference selbst spezialisieren. Ein Programm, das Spezialisierungen unter Verstoß gegen diese Regeln hinzufügt, hat undefiniertes Verhalten.
[bearbeiten] Anmerkungen
| Dieser Abschnitt ist unvollständig |
[bearbeiten] Beispiel
| Dieser Abschnitt ist unvollständig Grund: kein Beispiel |
[bearbeiten] Siehe auch
| (C++11) |
ermittelt den gemeinsamen Typ einer Gruppe von Typen (Klassenvorlage) |
| ermittelt den gemeinsamen Typ einer Menge von Typen (class template) | |
| gibt an, dass zwei Typen einen gemeinsamen Referenztyp haben (concept) |