Namespaces
Variants

std:: is_virtual_base_of

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
(C++11)
is_virtual_base_of
(C++26)
(C++11)
(C++11)
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
Definiert im Header <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 (unter Ignorierung von CV-Qualifizierern), liefert die Member-Konstante value den Wert true . Andernfalls ist value gleich false .

Wenn sowohl Base als auch Derived Nicht-Union-Klassentypen sind (unter Ignorierung von CV-Qualifizierern), sollte 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.

Inhaltsverzeichnis

Hilfsvariablen-Template

template < class Base, class Derived >
constexpr bool is_virtual_base_of_v = is_virtual_base_of < Base, Derived > :: value ;
(seit C++26)

Geerbt von std:: integral_constant

Member-Konstanten

value
[static]
true wenn Derived von der virtuellen Basisklasse Base abgeleitet ist (unter Ignorierung von CV-Qualifizierern), false andernfalls
(öffentliche statische Member-Konstante)

Member-Funktionen

operator bool
konvertiert das Objekt zu bool , gibt value zurück
(öffentliche Member-Funktion)
operator()
(C++14)
gibt value zurück
(öffentliche Member-Funktion)

Member-Typen

Typ Definition
value_type bool
type std:: integral_constant < bool , value >

Hinweise

std :: is_virtual_base_of_v < A, B > ist true selbst wenn A eine private, protected 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 gilt jedoch nicht immer, da die Überprüfung auf virtuelle Vererbung spezifischer ist. In diesem Fall ist std :: is_virtual_base_of_v < T, T > false , selbst wenn T ein Nicht-Union-Klassentyp ist.

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() {}

Siehe auch

(C++11)
prüft, ob ein Typ eine Basis eines anderen Typs ist
(Klassentemplate)
prüft, ob ein Typ in einen anderen Typ konvertiert werden kann
(Klassentemplate)
spezifiziert, dass ein Typ von einem anderen Typ abgeleitet ist
(Konzept)