std::incrementable_traits

std::incrementable_traits (증분 가능 타입 특성)

타입 I의 연관 차이 타입(associated difference type)을 계산하는 특성 클래스예요. C++20부터 있어요.

출처: cppreference

본문

<iterator> 헤더에 정의돼 있어요.

// (1) 기본 템플릿
template< class I >
struct incrementable_traits {};

// (2) 포인터 특수화
template< class T >
    requires std::is_object_v<T>
struct incrementable_traits<T*>;

// (3) const 한정 특수화
template< class T >
struct incrementable_traits<const T> : incrementable_traits<T> {};

// (4) difference_type 멤버가 있는 타입
template< class T >
    requires requires { typename T::difference_type; }
struct incrementable_traits<T>;

// (5) 뺄셈으로 integral을 만드는 타입
template< class T >
    requires (!requires { typename T::difference_type; }) &&
             requires(const T& a, const T& b) { { a - b } -> std::integral; }
struct incrementable_traits<T>;

타입 I의 연관 차이 타입을 계산해요(있다면). 프로그램 정의 타입에 대해 incrementable_traits를 특수화할 수 있어요.

    1. 기본 템플릿은 빈 구조체예요.
    1. 포인터 특수화 — std::ptrdiff_t와 같은 멤버 타입 difference_type을 제공해요.
    1. const 한정 타입 특수화 — incrementable_traits<T>를 상속해요.
    1. T::difference_type을 정의하는 타입 특수화.
    1. difference_type이 없지만 a - b가 integral을 만드는 타입 특수화 — difference_type은 뺄셈 결과의 타입으로 주어져요.

incrementable_traits<T>::difference_typeiter_difference_t<T>의 정의에 사용돼요.

예제

#include <iterator>
#include <vector>
#include <type_traits>

int main()
{
    static_assert(std::same_as<std::incrementable_traits<int*>::difference_type,
                               std::ptrdiff_t>);
    static_assert(std::same_as<std::iter_difference_t<std::vector<int>::iterator>,
                               std::ptrdiff_t>);
}

더 알아보기 (Learn more)

cppreference