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