Spec-Zone.ru › C++

std::is_virtual_base_of

Определён в заголовочном файле <type_traits>
template< class Base, class Derived >
struct is_virtual_base_of;
(начиная с C++26)

std::is_virtual_base_of — это двоичный типовой признак.

Если Base является виртуальным базовым классом Derived (без учёта квалификаторов cv), предоставляет константу-член value со значением true. В противном случае value — это false.

Если Base и Derived являются типами классов, не являющихся объединениями (без учёта квалификаторов cv), Derived должен быть полным типом; в противном случае поведение не определено.

Если программа добавляет специализации для std::is_virtual_base_of или std::is_virtual_base_of_v, поведение не определено.

Вспомогательный шаблон переменной

template< class Base, class Derived >
constexpr bool is_virtual_base_of_v = is_virtual_base_of<Base, Derived>::value;
(начиная с C++26)

Унаследовано от std::integral_constant

Константы-члены

value
[static]
true, если Derived является производным от виртуального базового класса Base (без учёта квалификаторов cv), иначе false
(открытая статическая константа-член)

Функции-члены

operator bool
преобразует объект в bool, возвращает value
(открытая функция-член)
operator()
(C++14)
возвращает value
(открытая функция-член)

Типы-члены

Тип Определение
value_type bool
type std::integral_constant<bool,value>

Примечания

std::is_virtual_base_of_v<A, B> является true, даже если A является закрытым, защищённым или неоднозначным базовым классом B.

Если std::is_virtual_base_of_v<A, B> — это true, то std::is_base_of_v<A, B> также является true. Однако обратное верно не всегда, поскольку проверка виртуального наследования более специфична. В этом случае std::is_virtual_base_of_v<T, T> является false, даже если T — это тип класса, не являющегося объединением.

Пример

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

См. также

is_base_of
(C++11)
проверяет, является ли один тип базовым для другого
(шаблон класса)
is_convertibleis_nothrow_convertible
(C++11)(C++20)
проверяет, можно ли преобразовать один тип в другой
(шаблон класса)
derived_from
(C++20)
задаёт условие, что один тип является производным от другого типа
(концепт)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/is_virtual_base_of

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API