std::is_virtual_base_of
| Definiert in der Kopfdatei <type_traits> |
||
| template< class Base, class Derived > struct is_virtual_base_of; |
(seit C++26) | |
std::is_virtual_base_of ist ein BinaryTypeTrait.
Wenn Base eine virtuelle Basisklasse von Derived ist (wobei cv-Qualifizierer ignoriert werden), liefert es das Mitglied-Konstante value gleich true. Andernfalls ist value false.
Wenn sowohl Base als auch Derived nicht-Union-Klassentypen sind (wobei cv-Qualifizierer ignoriert werden), muss Derived ein vollständiger Typ sein; andernfalls ist das Verhalten undefiniert.
Wenn das Programm Spezialisierungen für std::is_virtual_base_of oder std::is_virtual_base_of_v hinzufügt, ist das Verhalten undefiniert.
Inhalt |
[edit] Hilfsvariablen-Template
| template< class Base, class Derived > constexpr bool is_virtual_base_of_v = is_virtual_base_of<Base, Derived>::value; |
(seit C++26) | |
Abgeleitet von std::integral_constant
Member-Konstanten
| value [static] |
true, wenn Derived von der virtuellen Basisklasse Base abgeleitet ist (wobei cv-Qualifizierer ignoriert werden), andernfalls false(öffentliche statische Member-Konstante) |
Memberfunktionen
| operator bool |
konvertiert das Objekt zu bool, gibt value zurück (öffentliche Memberfunktion) |
| operator() (C++14) |
gibt value zurück (öffentliche Memberfunktion) |
Membertypen
| Typ | Definition |
value_type
|
bool |
type
|
std::integral_constant<bool, value> |
[edit] Anmerkungen
std::is_virtual_base_of_v<A, B> ist true, auch wenn A eine private, geschützte oder mehrdeutige Basisklasse von B ist.
Wenn std::is_virtual_base_of_v<A, B> true ist, dann ist auch std::is_base_of_v<A, B> true. Die Umkehrung ist jedoch nicht immer wahr, da die Prüfung auf virtuelle Vererbung spezifischer ist. In diesem Fall ist std::is_virtual_base_of_v<T, T> false, auch wenn T ein nicht-Union-Klassentyp ist.
[edit] Beispiel
#include <type_traits> class A {}; class B : A {}; class C : B {}; class D : virtual A {}; class E : D {}; union F {}; using I = int; static_assert ( std::is_virtual_base_of_v<A, A> != true && std::is_virtual_base_of_v<A, B> != true && std::is_virtual_base_of_v<A, D> == true && std::is_virtual_base_of_v<D, E> != true && std::is_virtual_base_of_v<F, F> != true && std::is_virtual_base_of_v<I, I> != true ); int main() {}
[edit] Siehe auch
| (C++11) |
prüft, ob ein Typ eine Basisklasse des anderen Typs ist (Klassenvorlage) |
| (C++11)(C++20) |
prüft, ob ein Typ in den anderen Typ konvertierbar ist (Klassenvorlage) |
| (C++20) |
gibt an, dass ein Typ von einem anderen Typ abgeleitet ist (Konzept) |