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