Metaprogramming library (since C++11)
C++는 타입 트레이트, 컴파일 타임 유리수 연산, 컴파일 타임 정수 시퀀스와 같은 메타프로그래밍 기능을 제공합니다.
목차 |
정의
다음 유형들을 총칭하여 referenceable types 라고 합니다:
참조 가능한 타입
T
에 대해, 그것에 대한 참조를 생성할 수 있습니다
[1]
.
- ↑ 참조 타입의 경우, 이는 reference collapsing 을 통해 수행될 수 있습니다.
타입 특성
타입 트레이트는 타입의 속성을 질의하기 위한 컴파일 타임 템플릿 기반 인터페이스를 정의합니다.
이 페이지에 정의된 템플릿을 <type_traits> 헤더에서 정의되고 이 페이지에 나열된 템플릿을 특수화하려는 시도는 정의되지 않은 동작을 초래합니다. 단, std::common_type 와 std::basic_common_reference (C++20부터) 는 설명에 따라 필요시 특수화될 수 있습니다.
<type_traits> 헤더에 정의된 템플릿은, 불완전한 타입으로 표준 라이브러리 템플릿을 인스턴스화하는 것을 일반적으로 금지함에도 불구하고, 별도로 명시되지 않는 한 불완전한 타입으로 인스턴스화될 수 있습니다.
베이스 클래스
대부분의 비변환 형식 특성은 UnaryTypeTrait 또는 BinaryTypeTrait 요구 사항을 충족시키기 위해 std::integral_constant 로부터 공개적이고 명확하게 파생되어야 합니다.
|
헤더 파일에 정의됨
<type_traits>
|
|
|
(C++11)
(C++17)
|
지정된 타입과 값을 가진 컴파일 타임 상수
(클래스 템플릿) |
std::integral_constant 의 bool 타입에 대한 두 가지 특수화가 제공됩니다:
|
헤더에 정의됨
<type_traits>
|
|
| 타입 | 정의 |
true_type
|
std:: integral_constant < bool , true > |
false_type
|
std:: integral_constant < bool , false > |
단항 타입 특성
단항 형식 특성은 컴파일 타임에 형식의 불리언 속성을 쿼리하는 데 사용할 수 있습니다.
이 모든 형식 특성들은 UnaryTypeTrait 을 만족하며, 각 형식 특성의 기본 특성은 해당 조건이 충족되는지 여부에 따라 std::true_type 또는 std::false_type 입니다.
기본 타입 범주 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(C++11)
|
타입이
void
인지 검사합니다
(클래스 템플릿) |
|
(C++11)
(
DR*
)
|
해당 타입이
std::nullptr_t
인지 확인합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 정수형 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 부동소수점 타입인지 확인합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 배열 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 열거형 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 union 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 non-union 클래스 타입인지 검사합니다
(class template) |
|
(C++11)
|
타입이 함수 타입인지 확인합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 포인터 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
해당 타입이
lvalue reference
인지 확인합니다
(클래스 템플릿) |
|
(C++11)
|
해당 타입이
rvalue reference
인지 확인합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 비정적 멤버 객체 포인터인지 확인합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 비정적 멤버 함수 포인터인지 검사합니다
(클래스 템플릿) |
복합 타입 카테고리 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(C++11)
|
타입이 기본 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 산술 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 스칼라 타입인지 확인합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 객체 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 복합 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
해당 타입이
lvalue reference
또는
rvalue reference
인지 검사합니다
(class template) |
|
(C++11)
|
타입이 비정적 멤버 함수나 객체에 대한 포인터인지 확인합니다
(클래스 템플릿) |
타입 속성 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(C++11)
|
타입이 const 한정자인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 volatile로 한정되었는지 검사합니다
(클래스 템플릿) |
|
(C++11)
(C++26에서 사용 중단됨)
|
타입이 trivial인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 trivially copyable인지 검사합니다
(class template) |
|
(C++11)
|
해당 타입이
standard-layout
타입인지 확인합니다
(클래스 템플릿) |
|
(C++11)
(deprecated in C++20)
|
타입이 POD(Plain-Old Data) 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
(C++17에서 사용 중단됨)
(C++20에서 제거됨)
|
리터럴 타입인지 확인합니다
(클래스 템플릿) |
|
해당 타입의 객체 표현에서 모든 비트가 값에 기여하는지 확인합니다
(클래스 템플릿) |
|
|
(C++11)
|
타입이 클래스(단, union 제외) 타입이고 비정적 데이터 멤버가 없는지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 다형성 클래스 타입인지 검사합니다
(class template) |
|
(C++11)
|
타입이 추상 클래스 타입인지 검사합니다
(클래스 템플릿) |
|
(C++14)
|
타입이 final 클래스 타입인지 검사합니다
(클래스 템플릿) |
|
(C++17)
|
타입이 집계 타입인지 확인합니다
(클래스 템플릿) |
|
(C++23)
|
타입이 암시적 수명 타입인지 확인합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 부호 있는 산술 타입인지 검사합니다
(클래스 템플릿) |
|
(C++11)
|
타입이 부호 없는 산술 타입인지 검사합니다
(class template) |
|
(C++20)
|
타입이 알려진 크기의 배열 타입인지 검사합니다
(클래스 템플릿) |
|
(C++20)
|
타입이 경계를 알 수 없는 배열 타입인지 검사합니다
(클래스 템플릿) |
|
(C++23)
|
타입이 범위 지정 열거형 타입인지 확인합니다
(클래스 템플릿) |
지원되는 연산 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(C++11)
(C++11)
(C++11)
|
특정 인수에 대한 생성자가 있는지 확인
(클래스 템플릿) |
|
(C++11)
(C++11)
(C++11)
|
기본 생성자가 있는지 확인
(클래스 템플릿) |
|
(C++11)
(C++11)
(C++11)
|
복사 생성자가 있는지 확인
(클래스 템플릿) |
|
(C++11)
(C++11)
(C++11)
|
rvalue 참조로부터 생성 가능한지 확인
(클래스 템플릿) |
|
(C++11)
(C++11)
(C++11)
|
특정 인수에 대한 할당 연산자가 있는지 확인
(클래스 템플릿) |
|
(C++11)
(C++11)
(C++11)
|
복사 할당 연산자가 있는지 확인
(클래스 템플릿) |
|
(C++11)
(C++11)
(C++11)
|
이동 할당 연산자가 있는지 확인
(클래스 템플릿) |
|
(C++11)
(C++11)
(C++11)
|
삭제되지 않은 소멸자가 있는지 확인
(클래스 템플릿) |
|
(C++11)
|
가상 소멸자가 있는지 확인
(클래스 템플릿) |
|
(C++17)
(C++17)
(C++17)
(C++17)
|
동일하거나 다른 타입의 객체와 교환 가능한지 확인
(클래스 템플릿) |
|
직접 초기화에서 임시 객체에 참조가 바인딩되는지 확인
(클래스 템플릿) |
|
|
복사 초기화에서 임시 객체에 참조가 바인딩되는지 확인
(클래스 템플릿) |
|
속성 쿼리
속성 질의 특성(property query traits)은 컴파일 타임에 타입의 정수형 속성들을 질의하는 데 사용할 수 있습니다.
이 모든 형식 특성들은
UnaryTypeTrait
을 만족하며, 각 형식 특성의 기본 특성은
std::
integral_constant
<
std::
size_t
, Value
>
입니다. 여기서
Value
는 해당 속성의 질의 결과입니다.
|
헤더 파일에 정의됨
<type_traits>
|
|
|
(C++11)
|
타입의 정렬 요구사항을 얻음
(클래스 템플릿) |
|
(C++11)
|
배열 타입의 차원 수를 얻음
(클래스 템플릿) |
|
(C++11)
|
지정된 차원을 따라 배열 타입의 크기를 얻음
(클래스 템플릿) |
타입 관계
타입 관계 특성은 컴파일 타임에 타입 간의 관계를 조회하는 데 사용할 수 있습니다.
이 모든 형식 특성들은 BinaryTypeTrait 을 만족하며, 각 형식 특성의 기본 특성은 해당 조건이 충족되는지 여부에 따라 std::true_type 또는 std::false_type 입니다.
|
헤더 파일에 정의됨
<type_traits>
|
|
|
(C++11)
|
두 타입이 동일한지 검사
(클래스 템플릿) |
|
(C++11)
|
한 타입이 다른 타입의 베이스인지 검사
(클래스 템플릿) |
|
(C++26)
|
한 타입이 다른 타입의 가상 베이스인지 검사
(클래스 템플릿) |
|
(C++11)
(C++20)
|
한 타입이 다른 타입으로 변환 가능한지 검사
(클래스 템플릿) |
|
(C++20)
|
두 타입이
레이아웃 호환
인지 검사
(클래스 템플릿) |
|
한 타입이 다른 타입의
포인터 상호 변환 가능
(초기) 베이스인지 검사
(클래스 템플릿) |
|
|
타입이 주어진 인수 타입들로 호출 가능한지 검사 (
std::invoke
로 호출하는 것처럼)
(클래스 템플릿) |
|
타입 변환
타입 변환 특성은 일부 미리 정의된 규칙에 따라 한 타입을 다른 타입으로 변환합니다.
이 모든 형식 특성들은 TransformationTrait 을 만족합니다.
Const-volatility 지정자 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(C++11)
(C++11)
(C++11)
|
주어진 타입에서
const
및/또는
volatile
지정자를 제거함
(클래스 템플릿) |
|
(C++11)
(C++11)
(C++11)
|
주어진 타입에
const
및/또는
volatile
지정자를 추가함
(클래스 템플릿) |
참고문헌 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(C++11)
|
주어진 타입에서 참조를 제거함
(클래스 템플릿) |
|
(C++11)
(C++11)
|
주어진 타입에
lvalue
또는
rvalue
참조자를 추가함
(클래스 템플릿) |
부호 지정자 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(C++11)
|
주어진 정수형에 해당하는 부호 있는 타입을 얻음
(클래스 템플릿) |
|
(C++11)
|
주어진 정수형에 해당하는 부호 없는 타입을 얻음
(클래스 템플릿) |
배열 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(C++11)
|
주어진 배열 타입에서 하나의 차원을 제거함
(클래스 템플릿) |
|
(C++11)
|
주어진 배열 타입에서 모든 차원을 제거함
(클래스 템플릿) |
포인터 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(C++11)
|
주어진 타입에서 포인터를 제거함
(클래스 템플릿) |
|
(C++11)
|
주어진 타입에 포인터를 추가합니다
(클래스 템플릿) |
기타 변환 |
|
|
헤더에 정의됨
<type_traits>
|
|
|
(since C++11)
(deprecated in C++23)
|
주어진 크기의 타입들을 위한 초기화되지 않은 저장소로 사용하기 적합한 타입을 정의함
(class template) |
|
(C++11 이후)
(C++23에서 사용 중단됨)
|
주어진 모든 타입에 대해 초기화되지 않은 저장소로 사용하기 적합한 타입을 정의함
(클래스 템플릿) |
|
(C++11)
|
함수 인자를 값으로 전달할 때와 동일한 타입 변환을 적용합니다
(클래스 템플릿) |
|
(C++20)
|
std::remove_cv
와
std::remove_reference
를 결합
(클래스 템플릿) |
|
(C++11)
|
오버로드 해결에서 함수 오버로드나 템플릿 특수화를 조건부로
제거
합니다
(클래스 템플릿) |
|
(C++11)
|
컴파일 타임 불리언 값에 따라 한 타입 또는 다른 타입을 선택합니다
(클래스 템플릿) |
|
(C++11)
|
여러 타입들의 공통 타입을 결정합니다
(클래스 템플릿) |
|
여러 타입들의 공통 참조 타입을 결정합니다
(클래스 템플릿) |
|
|
(C++11)
|
주어진 열거형 타입에 대한 기본 정수 타입을 구함
(클래스 템플릿) |
|
(C++11)
(C++20에서 제거됨)
(C++17)
|
호출 가능 객체를 인수 집합으로 호출한 결과 타입을 추론합니다
(클래스 템플릿) |
|
(C++17)
|
void 가변 별칭 템플릿
(별칭 템플릿) |
|
(C++20)
|
타입 인자를 변경 없이 반환함
(클래스 템플릿) |
논리 연산 (C++17부터)
논리 연산자 특성은 다른 형식 특성에 논리 연산자를 적용합니다.
|
헤더에 정의됨
<type_traits>
|
|
|
(C++17)
|
가변 논리 AND 메타함수
(클래스 템플릿) |
|
(C++17)
|
가변 논리 OR 메타함수
(클래스 템플릿) |
|
(C++17)
|
논리 NOT 메타함수
(클래스 템플릿) |
멤버 관계 (since C++20)
|
헤더 파일에 정의됨
<type_traits>
|
|
|
해당 타입의 객체가 해당 타입의 지정된 하위 객체와
pointer-interconvertible
인지 확인
(함수 템플릿) |
|
|
(C++20)
|
두 지정된 타입의 공통 초기 부분 순열에서 두 지정된 멤버가 서로 대응하는지 확인
(함수 템플릿) |
컴파일 시 유리수 연산
<ratio> 헤더는 컴파일 타임 비율을 조작하고 저장하기 위한 타입과 함수들을 제공합니다.
컴파일 타임 정수 시퀀스 (C++14부터)
|
헤더 파일에 정의됨
<utility>
|
|
|
(C++14)
|
컴파일 타임 정수 시퀀스를 구현함
(클래스 템플릿) |