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() {}
См. также
|
(C++11) | проверяет, является ли один тип базовым для другого (шаблон класса) |
|
(C++11)(C++20) | проверяет, можно ли преобразовать один тип в другой (шаблон класса) |
|
(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