Spec-Zone.ru › C++

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
(открытая статическая константа-член)

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

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++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 2015 C++11 поведение могло быть не определено, если
Derived является неполным типом объединения
в этом случае базовая характеристика
std::false_type

См. также

is_virtual_base_of
(C++26)
проверяет, является ли тип виртуальным базовым классом другого типа
(шаблон класса)
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_base_of

Spec-Zone.ru

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