std::projected

std::projected (projection 적용 반복자)

반복자 I에 projection Proj를 적용한 결과를 나타내는 타입이에요. 범위 알고리즘이 projection 후의 값 타입·차이 타입을 다루게 해줘요. C++20부터 있어요(C++26에서 타입 별칭으로 변경).

출처: cppreference

본문

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

// (1) C++20~C++26
template< std::indirectly_readable I,
          std::indirectly_regular_unary_invocable<I> Proj >
struct projected
{
    using value_type = std::remove_cvref_t<std::indirect_result_t<Proj&, I>>;
    std::indirect_result_t<Proj&, I> operator*() const; // not defined
};

// C++26부터
template< std::indirectly_readable I,
          std::indirectly_regular_unary_invocable<I> Proj >
using projected = /*projected-impl*/<I, Proj>::/*__type*/;

// (2) C++20~C++26
template< std::weakly_incrementable I, class Proj >
struct incrementable_traits<std::projected<I, Proj>>
{
    using difference_type = std::iter_difference_t<I>;
};
    1. projected는 반복자 I에 projection Proj를 적용한 결과 타입이에요. value_type은 projection 결과에서 cv·참조를 제거한 타입이에요.
    1. projected<I, Proj>의 차이 타입은 기본 반복자의 차이 타입과 같다고 명세해요.
  • C++26부터는 타입 별칭으로 바뀌고, value_type과 함께 내부 impl 구조체가 사용돼요.

예제

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

int main()
{
    using P = std::projected<std::vector<int>::iterator, std::negate<>>;
    // value_type은 int
}

더 알아보기 (Learn more)

cppreference