Namespaces
Variants

Metaprogramming library (since C++11)

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences

C++는 타입 트레이트, 컴파일 타임 유리수 연산, 컴파일 타임 정수 시퀀스와 같은 메타프로그래밍 기능을 제공합니다.

목차

정의

다음 유형들을 총칭하여 referenceable types 라고 합니다:

참조 가능한 타입 T 에 대해, 그것에 대한 참조를 생성할 수 있습니다 [1] .

  1. 참조 타입의 경우, 이는 reference collapsing 을 통해 수행될 수 있습니다.

타입 특성

타입 트레이트는 타입의 속성을 질의하기 위한 컴파일 타임 템플릿 기반 인터페이스를 정의합니다.

이 페이지에 정의된 템플릿을 <type_traits> 헤더에서 정의되고 이 페이지에 나열된 템플릿을 특수화하려는 시도는 정의되지 않은 동작을 초래합니다. 단, std::common_type std::basic_common_reference (C++20부터) 는 설명에 따라 필요시 특수화될 수 있습니다.

<type_traits> 헤더에 정의된 템플릿은, 불완전한 타입으로 표준 라이브러리 템플릿을 인스턴스화하는 것을 일반적으로 금지함에도 불구하고, 별도로 명시되지 않는 한 불완전한 타입으로 인스턴스화될 수 있습니다.

베이스 클래스

대부분의 비변환 형식 특성은 UnaryTypeTrait 또는 BinaryTypeTrait 요구 사항을 충족시키기 위해 std::integral_constant 로부터 공개적이고 명확하게 파생되어야 합니다.

헤더 파일에 정의됨 <type_traits>
지정된 타입과 값을 가진 컴파일 타임 상수
(클래스 템플릿)

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)
타입이 union 타입인지 검사합니다
(클래스 템플릿)
(C++11)
타입이 non-union 클래스 타입인지 검사합니다
(class template)
타입이 함수 타입인지 확인합니다
(클래스 템플릿)
(C++11)
타입이 포인터 타입인지 검사합니다
(클래스 템플릿)
해당 타입이 lvalue reference 인지 확인합니다
(클래스 템플릿)
해당 타입이 rvalue reference 인지 확인합니다
(클래스 템플릿)
타입이 비정적 멤버 객체 포인터인지 확인합니다
(클래스 템플릿)
타입이 비정적 멤버 함수 포인터인지 검사합니다
(클래스 템플릿)
복합 타입 카테고리
헤더에 정의됨 <type_traits>
타입이 기본 타입인지 검사합니다
(클래스 템플릿)
타입이 산술 타입인지 검사합니다
(클래스 템플릿)
(C++11)
타입이 스칼라 타입인지 확인합니다
(클래스 템플릿)
(C++11)
타입이 객체 타입인지 검사합니다
(클래스 템플릿)
타입이 복합 타입인지 검사합니다
(클래스 템플릿)
해당 타입이 lvalue reference 또는 rvalue reference 인지 검사합니다
(class template)
타입이 비정적 멤버 함수나 객체에 대한 포인터인지 확인합니다
(클래스 템플릿)
타입 속성
헤더에 정의됨 <type_traits>
(C++11)
타입이 const 한정자인지 검사합니다
(클래스 템플릿)
타입이 volatile로 한정되었는지 검사합니다
(클래스 템플릿)
(C++11) (C++26에서 사용 중단됨)
타입이 trivial인지 검사합니다
(클래스 템플릿)
타입이 trivially copyable인지 검사합니다
(class template)
해당 타입이 standard-layout 타입인지 확인합니다
(클래스 템플릿)
(C++11) (deprecated in C++20)
타입이 POD(Plain-Old Data) 타입인지 검사합니다
(클래스 템플릿)
(C++11) (C++17에서 사용 중단됨) (C++20에서 제거됨)
리터럴 타입인지 확인합니다
(클래스 템플릿)
해당 타입의 객체 표현에서 모든 비트가 값에 기여하는지 확인합니다
(클래스 템플릿)
(C++11)
타입이 클래스(단, union 제외) 타입이고 비정적 데이터 멤버가 없는지 검사합니다
(클래스 템플릿)
타입이 다형성 클래스 타입인지 검사합니다
(class template)
타입이 추상 클래스 타입인지 검사합니다
(클래스 템플릿)
(C++14)
타입이 final 클래스 타입인지 검사합니다
(클래스 템플릿)
타입이 집계 타입인지 확인합니다
(클래스 템플릿)
타입이 암시적 수명 타입인지 확인합니다
(클래스 템플릿)
(C++11)
타입이 부호 있는 산술 타입인지 검사합니다
(클래스 템플릿)
타입이 부호 없는 산술 타입인지 검사합니다
(class template)
타입이 알려진 크기의 배열 타입인지 검사합니다
(클래스 템플릿)
타입이 경계를 알 수 없는 배열 타입인지 검사합니다
(클래스 템플릿)
타입이 범위 지정 열거형 타입인지 확인합니다
(클래스 템플릿)
지원되는 연산
헤더에 정의됨 <type_traits>
특정 인수에 대한 생성자가 있는지 확인
(클래스 템플릿)
기본 생성자가 있는지 확인
(클래스 템플릿)
복사 생성자가 있는지 확인
(클래스 템플릿)
rvalue 참조로부터 생성 가능한지 확인
(클래스 템플릿)
특정 인수에 대한 할당 연산자가 있는지 확인
(클래스 템플릿)
복사 할당 연산자가 있는지 확인
(클래스 템플릿)
이동 할당 연산자가 있는지 확인
(클래스 템플릿)
삭제되지 않은 소멸자가 있는지 확인
(클래스 템플릿)
가상 소멸자가 있는지 확인
(클래스 템플릿)
동일하거나 다른 타입의 객체와 교환 가능한지 확인
(클래스 템플릿)
직접 초기화에서 임시 객체에 참조가 바인딩되는지 확인
(클래스 템플릿)
복사 초기화에서 임시 객체에 참조가 바인딩되는지 확인
(클래스 템플릿)

속성 쿼리

속성 질의 특성(property query traits)은 컴파일 타임에 타입의 정수형 속성들을 질의하는 데 사용할 수 있습니다.

이 모든 형식 특성들은 UnaryTypeTrait 을 만족하며, 각 형식 특성의 기본 특성은 std:: integral_constant < std:: size_t , Value > 입니다. 여기서 Value 는 해당 속성의 질의 결과입니다.

헤더 파일에 정의됨 <type_traits>
타입의 정렬 요구사항을 얻음
(클래스 템플릿)
(C++11)
배열 타입의 차원 수를 얻음
(클래스 템플릿)
(C++11)
지정된 차원을 따라 배열 타입의 크기를 얻음
(클래스 템플릿)

타입 관계

타입 관계 특성은 컴파일 타임에 타입 간의 관계를 조회하는 데 사용할 수 있습니다.

이 모든 형식 특성들은 BinaryTypeTrait 을 만족하며, 각 형식 특성의 기본 특성은 해당 조건이 충족되는지 여부에 따라 std::true_type 또는 std::false_type 입니다.

헤더 파일에 정의됨 <type_traits>
(C++11)
두 타입이 동일한지 검사
(클래스 템플릿)
(C++11)
한 타입이 다른 타입의 베이스인지 검사
(클래스 템플릿)
한 타입이 다른 타입의 가상 베이스인지 검사
(클래스 템플릿)
한 타입이 다른 타입으로 변환 가능한지 검사
(클래스 템플릿)
두 타입이 레이아웃 호환 인지 검사
(클래스 템플릿)
한 타입이 다른 타입의 포인터 상호 변환 가능 (초기) 베이스인지 검사
(클래스 템플릿)
타입이 주어진 인수 타입들로 호출 가능한지 검사 ( std::invoke 로 호출하는 것처럼)
(클래스 템플릿)

타입 변환

타입 변환 특성은 일부 미리 정의된 규칙에 따라 한 타입을 다른 타입으로 변환합니다.

이 모든 형식 특성들은 TransformationTrait 을 만족합니다.

Const-volatility 지정자
헤더에 정의됨 <type_traits>
주어진 타입에서 const 및/또는 volatile 지정자를 제거함
(클래스 템플릿)
(C++11) (C++11) (C++11)
주어진 타입에 const 및/또는 volatile 지정자를 추가함
(클래스 템플릿)
참고문헌
헤더에 정의됨 <type_traits>
주어진 타입에서 참조를 제거함
(클래스 템플릿)
주어진 타입에 lvalue 또는 rvalue 참조자를 추가함
(클래스 템플릿)
부호 지정자
헤더에 정의됨 <type_traits>
주어진 정수형에 해당하는 부호 있는 타입을 얻음
(클래스 템플릿)
주어진 정수형에 해당하는 부호 없는 타입을 얻음
(클래스 템플릿)
배열
헤더에 정의됨 <type_traits>
주어진 배열 타입에서 하나의 차원을 제거함
(클래스 템플릿)
주어진 배열 타입에서 모든 차원을 제거함
(클래스 템플릿)
포인터
헤더에 정의됨 <type_traits>
주어진 타입에서 포인터를 제거함
(클래스 템플릿)
주어진 타입에 포인터를 추가합니다
(클래스 템플릿)
기타 변환
헤더에 정의됨 <type_traits>
(since C++11) (deprecated in C++23)
주어진 크기의 타입들을 위한 초기화되지 않은 저장소로 사용하기 적합한 타입을 정의함
(class template)
(C++11 이후) (C++23에서 사용 중단됨)
주어진 모든 타입에 대해 초기화되지 않은 저장소로 사용하기 적합한 타입을 정의함
(클래스 템플릿)
(C++11)
함수 인자를 값으로 전달할 때와 동일한 타입 변환을 적용합니다
(클래스 템플릿)
std::remove_cv std::remove_reference 를 결합
(클래스 템플릿)
(C++11)
오버로드 해결에서 함수 오버로드나 템플릿 특수화를 조건부로 제거 합니다
(클래스 템플릿)
컴파일 타임 불리언 값에 따라 한 타입 또는 다른 타입을 선택합니다
(클래스 템플릿)
여러 타입들의 공통 타입을 결정합니다
(클래스 템플릿)
여러 타입들의 공통 참조 타입을 결정합니다
(클래스 템플릿)
주어진 열거형 타입에 대한 기본 정수 타입을 구함
(클래스 템플릿)
(C++11) (C++20에서 제거됨) (C++17)
호출 가능 객체를 인수 집합으로 호출한 결과 타입을 추론합니다
(클래스 템플릿)
(C++17)
void 가변 별칭 템플릿
(별칭 템플릿)
타입 인자를 변경 없이 반환함
(클래스 템플릿)

논리 연산 (C++17부터)

논리 연산자 특성은 다른 형식 특성에 논리 연산자를 적용합니다.

헤더에 정의됨 <type_traits>
가변 논리 AND 메타함수
(클래스 템플릿)
가변 논리 OR 메타함수
(클래스 템플릿)
(C++17)
논리 NOT 메타함수
(클래스 템플릿)

멤버 관계 (since C++20)

헤더 파일에 정의됨 <type_traits>
해당 타입의 객체가 해당 타입의 지정된 하위 객체와 pointer-interconvertible 인지 확인
(함수 템플릿)
두 지정된 타입의 공통 초기 부분 순열에서 두 지정된 멤버가 서로 대응하는지 확인
(함수 템플릿)

컴파일 시 유리수 연산

<ratio> 헤더는 컴파일 타임 비율을 조작하고 저장하기 위한 타입과 함수들을 제공합니다.

컴파일 타임 정수 시퀀스 (C++14부터)

헤더 파일에 정의됨 <utility>
컴파일 타임 정수 시퀀스를 구현함
(클래스 템플릿)