Пространства имён
Варианты
Действия

std::is_pointer_interconvertible_base_of

Материал из cppreference.com
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
(C++11)(C++11)(C++11)
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
<tbody> </tbody>
Определено в заголовочном файле <type_traits>
template< class Base, class Derived > struct is_pointer_interconvertible_base_of;
(начиная с C++20)

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

Если и Base и Derived являются типами классов не объединений, и они не являются одним и тем же типом (игнорируя cv-квалификацию), Derived должен быть полным типом; иначе поведение не определено.

Поведение программы, добавляющей специализации для std::is_pointer_interconvertible_base_of или std::is_pointer_interconvertible_base_of_v не определено.

Вспомогательная шаблонная переменная

<tbody> </tbody>
template< class Base, class Derived > inline constexpr bool is_pointer_interconvertible_base_of_v = is_pointer_interconvertible_base_of<Base, Derived>::value;
(начиная с C++20)

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

Константы элементы

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

Функции-элементы

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

Типы элементы

Тип Определение
value_type bool
type std::integral_constant<bool, value>

Примечание

std::is_pointer_interconvertible_base_of_v<T, U> может быть true, даже если T является закрытым или защищённым базовым классом U.

Пусть

  • U полный объектный тип,
  • T полный объектный тип с cv-квалификацией не меньше, чем у U,
  • u любое допустимое lvalue типа U,

reinterpret_cast<T&>(u) всегда имеет чётко определённый результат, если std::is_pointer_interconvertible_base_of_v<T, U> равно true.

Если T и U не одного типа (без учёта cv-квалификации) и T является базовым классом класса U, взаимопреобразуемым по указателю, то оба std::is_standard_layout_v<T> и std::is_standard_layout_v<U> равны true.

Если T является классовым типом со стандартной компоновкой, то все базовые классы для T (если таковые имеются) являются базовыми классами для T взаимопреобразуемыми по указателю.

Макрос Тестирования функциональности Значение Стандарт Функциональность
__cpp_lib_is_pointer_interconvertible 201907L (C++20) Свойства взаимопреобразуемости указателя:
  • std::is_pointer_interconvertible_base_of,
  • std::is_pointer_interconvertible_with_class

Пример

#include <type_traits>

struct Foo {};

struct Bar {};

class Baz : Foo, public Bar { int x; };

class NonStdLayout : public Baz { int y; };

static_assert( std::is_pointer_interconvertible_base_of_v<Bar, Baz> );
static_assert( std::is_pointer_interconvertible_base_of_v<Foo, Baz> );
static_assert( not std::is_pointer_interconvertible_base_of_v<Baz, NonStdLayout> );
static_assert( std::is_pointer_interconvertible_base_of_v<NonStdLayout, NonStdLayout> );

int main()
{
}

Смотрите также

проверяет, является ли тип производным от другого типа
(шаблон класса) [править]
(C++11)
проверяет, является ли тип классовым типом (но не объединением) и не имеет нестатических элементов данных
(шаблон класса) [править]
проверяет, является ли тип типом со стандартной компоновкой
(шаблон класса) [править]