std:: is_base_of
|
Определено в заголовке
<type_traits>
|
||
|
template
<
class
Base,
class
Derived
>
struct is_base_of ; |
(начиная с C++11) | |
std::is_base_of
является
BinaryTypeTrait
.
Если
Derived
является
производным
от
Base
или если оба являются одним и тем же не-объединенным классом (в обоих случаях игнорируя cv-квалификаторы), предоставляет константу-член
value
равную
true
. В противном случае
value
равна
false
.
Если оба
Base
и
Derived
являются типами классов, не являющихся объединениями, и они не являются одним и тем же типом (игнорируя cv-квалификаторы),
Derived
должен быть
полным типом
; в противном случае поведение не определено.
Если программа добавляет специализации для
std::is_base_of
или
std::is_base_of_v
(начиная с C++17)
, поведение не определено.
Содержание |
Шаблон вспомогательной переменной
|
template
<
class
Base,
class
Derived
>
constexpr bool is_base_of_v = is_base_of < Base, Derived > :: value ; |
(начиная с C++17) | |
Унаследовано от std:: integral_constant
Константы-члены
|
value
[static]
|
true
если
Derived
является производным от
Base
или если оба являются одним и тем же классом (не объединением) (в обоих случаях игнорируя cv-квалификаторы),
false
в противном случае
(public static member constant) |
Функции-члены
|
operator bool
|
преобразует объект в
bool
, возвращает
value
(public member function) |
|
operator()
(C++14)
|
возвращает
value
(public member function) |
Типы-члены
| Тип | Определение |
value_type
|
bool |
type
|
std:: integral_constant < bool , value > |
Примечания
std
::
is_base_of
<
A, B
>
::
value
имеет значение
true
даже если
A
является приватным, защищенным или неоднозначным базовым классом
B
. Во многих ситуациях
std::
is_convertible
<
B
*
, A
*
>
является более подходящей проверкой.
Хотя ни один класс не является собственным базовым,
std
::
is_base_of
<
T, T
>
::
value
равно true, поскольку цель этого трейта — моделирование отношения «является», и
T
является
T
. Несмотря на это,
std
::
is_base_of
<
int
,
int
>
::
value
равно
false
, поскольку только классы участвуют в отношении, которое моделирует этот трейт.
Возможная реализация
namespace details { template<typename B> std::true_type test_ptr_conv(const volatile B*); template<typename> std::false_type test_ptr_conv(const volatile void*); template<typename B, typename D> auto test_is_base_of(int) -> decltype(test_ptr_conv<B>(static_cast<D*>(nullptr))); template<typename, typename> auto test_is_base_of(...) -> std::true_type; // приватное или неоднозначное базовое наследование } template<typename Base, typename Derived> struct is_base_of : std::integral_constant< bool, std::is_class<Base>::value && std::is_class<Derived>::value && decltype(details::test_is_base_of<Base, Derived>(0))::value > {}; |
` и `` оставлен без изменений
- HTML-теги и атрибуты сохранены в оригинальном виде
- Специфические термины C++ (namespace, template, typename и др.) не переводились
Пример
#include <type_traits> class A {}; class B : A {}; class C : B {}; class D {}; union E {}; using I = int; static_assert ( std::is_base_of_v<A, A> == true && std::is_base_of_v<A, B> == true && std::is_base_of_v<A, C> == true && std::is_base_of_v<A, D> != true && std::is_base_of_v<B, A> != true && std::is_base_of_v<E, E> != true && std::is_base_of_v<I, I> != true ); int main() {}
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2015 | C++11 |
the behavior might be undefined if
Derived
is an incomplete union type
|
the base characteristic is
std::false_type in this case |
Смотрите также
|
(C++26)
|
проверяет, является ли тип виртуальным базовым классом другого типа
(шаблон класса) |
|
(C++11)
(C++20)
|
проверяет, может ли тип быть преобразован в другой тип
(шаблон класса) |
|
(C++20)
|
указывает, что тип является производным от другого типа
(концепт) |