types_is_pointer_interconvertible_base_of

types_is_pointer_interconvertible_base_of (포인터 상호 변환 가능 베이스 클래스 판별)

이 페이지는 C++20에서 도입된 std::is_pointer_interconvertible_base_of 타입 특성에 대해 설명해요. 이 특성은 어떤 클래스가 다른 클래스의 포인터 상호 변환 가능 베이스 클래스인지 컴파일 타임에 판별해요. 또한 관련된 변수 템플릿과 상속된 멤버, 사용 예시도 함께 다룬답니다.

출처: cppreference

본문

정의

헤더 <type_traits>에 정의됨
template < class Base , class Derived > struct is_pointer_interconvertible_base_of ; (since C++20)

DerivedBase로부터 명확하게(unambiguously) 파생되었고 모든 Derived 객체가 자신의 Base 하위 객체와 포인터 상호 변환 가능(pointer-interconvertible)하거나, 둘 다 동일한 비-공용체 클래스인 경우(두 경우 모두 cv-한정은 무시), 멤버 상수 valuetrue가 돼요. 그렇지 않으면 valuefalse예요.

BaseDerived가 모두 비-공용체 클래스 타입이고 서로 같은 타입이 아니라면(cv-한정 무시), Derived는 완전 타입(complete type)이어야 해요. 그렇지 않으면 동작이 정의되지 않아요.

프로그램이 std::is_pointer_interconvertible_base_of 또는 std::is_pointer_interconvertible_base_of_v에 대한 특수화를 추가하면 동작이 정의되지 않아요.

Helper 변수 템플릿

template < class Base , class Derived > constexpr bool is_pointer_interconvertible_base_of_v = is_pointer_interconvertible_base_of < Base , Derived >:: value ; (since C++20)

std::integral_constant에서 상속됨

멤버 상수

멤버 정의
value [static] DerivedBase로부터 명확하게 파생되었고 모든 Derived 객체가 자신의 Base 하위 객체와 포인터 상호 변환 가능하거나, 둘 다 동일한 비-공용체 클래스인 경우 true(두 경우 모두 cv-한정 무시), 그렇지 않으면 false (공용 정적 멤버 상수)

멤버 함수

멤버 함수 설명
operator bool 객체를 bool로 변환하고 value를 반환해요 (공용 멤버 함수)
operator() (C++14) value를 반환해요 (공용 멤버 함수)

멤버 타입

타입 정의
value_type bool
type std::integral_constant<bool, value>

Notes

std::is_pointer_interconvertible_base_of_v<T, U>TU의 private 또는 protected 베이스 클래스인 경우에도 true일 수 있어요.

다음을 가정해요.

  • U를 완전 객체 타입,
  • TU보다 cv-한정이 덜하지 않은 완전 객체 타입,
  • uU의 유효한 lvalue,

std::is_pointer_interconvertible_base_of_v<T, U>true이면 reinterpret_cast<T&>(u)는 항상 잘 정의된 결과를 가져요.

TU가 같은 타입이 아니고(cv-한정 무시) TU의 포인터 상호 변환 가능 베이스 클래스라면, std::is_standard_layout_v<T>std::is_standard_layout_v<U>는 모두 true예요.

T가 표준 레이아웃 클래스 타입이라면, T의 모든 베이스 클래스(있다면)는 T의 포인터 상호 변환 가능 베이스 클래스예요.

Feature-test 매크로

Feature-test 매크로 표준 기능
__cpp_lib_is_pointer_interconvertible 201907L (C++20) 포인터 상호 변환 가능 특성: std::is_pointer_interconvertible_base_of, std::is_pointer_interconvertible_with_class

Example

#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() {}

See also

관련 항목 설명
is_base_of (C++11) 한 타입이 다른 타입의 베이스인지 확인해요 (클래스 템플릿)
is_empty (C++11) 타입이 클래스(공용체 아님) 타입이고 비정적 데이터 멤버가 없는지 확인해요 (클래스 템플릿)
is_standard_layout (C++11) 타입이 표준 레이아웃 타입인지 확인해요 (클래스 템플릿)
is_pointer_interconvertible_with_class (C++20) 한 타입의 객체가 해당 타입의 지정된 하위 객체와 포인터 상호 변환 가능한지 확인해요 (함수 템플릿)
is_pointer_interconvertible_base_of_type (C++26) 반영된 타입이 다른 타입의 포인터 상호 변환 가능 베이스인지 확인해요 (함수)

더 알아보기 (Learn more)

cppreference