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) |
Derived가 Base로부터 명확하게(unambiguously) 파생되었고 모든 Derived 객체가 자신의 Base 하위 객체와 포인터 상호 변환 가능(pointer-interconvertible)하거나, 둘 다 동일한 비-공용체 클래스인 경우(두 경우 모두 cv-한정은 무시), 멤버 상수 value는 true가 돼요. 그렇지 않으면 value는 false예요.
Base와 Derived가 모두 비-공용체 클래스 타입이고 서로 같은 타입이 아니라면(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] |
Derived가 Base로부터 명확하게 파생되었고 모든 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>는 T가 U의 private 또는 protected 베이스 클래스인 경우에도 true일 수 있어요.
다음을 가정해요.
U를 완전 객체 타입,T를U보다 cv-한정이 덜하지 않은 완전 객체 타입,u를U의 유효한 lvalue,
std::is_pointer_interconvertible_base_of_v<T, U>가 true이면 reinterpret_cast<T&>(u)는 항상 잘 정의된 결과를 가져요.
T와 U가 같은 타입이 아니고(cv-한정 무시) T가 U의 포인터 상호 변환 가능 베이스 클래스라면, 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) |
반영된 타입이 다른 타입의 포인터 상호 변환 가능 베이스인지 확인해요 (함수) |