Spec-Zone.ru › C++

std::is_base_of

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

Это 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 >
inline constexpr bool is_base_of_v = is_base_of<Base, Derived>::value;
(с C++17)

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

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

value
[статический]
true если Derived происходит от Base или если оба являются одним и тем же классом без объединения (в обоих случаях игнорируя cv-квалификацию), false в противном случае
(публичная статическая константа-член)

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

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

Типы-члены

Тип Определение
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 истинно, потому что цель свойства — смоделировать отношение "является", а 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; // private or ambiguous base
}
 
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
    > {};

Пример

#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 Применимо к Поведение, как опубликовано Правильное поведение
LWG 2015 C++11 поведение может быть неопределенным, если
Derived является неполным типом объединения
базовая характеристика является
std::false_type в этом случае

См. также

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/w/cpp/types/is_base_of

Spec-Zone.ru

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