Namespaces
Variants

std:: range_formatter

From cppreference.net
헤더에 정의됨 <format>
template < class T, class CharT = char >

requires std:: same_as < std:: remove_cvref_t < T > , T > && std:: formattable < T, CharT >

class range_formatter ;
(C++23부터)

std::range_formatter 는 범위 std::formatter 특수화를 구현하기 위한 도우미 클래스 템플릿입니다.

목차

범위 형식 사양

range-format-spec 의 구문은 다음과 같습니다:

range-fill-and-align  (선택적) width  (선택적) n (선택적) range-type  (선택적) range-underlying-spec  (선택적)

range-fill-and-align fill-and-align 과 동일한 방식으로 해석되지만, range-fill-and-align 에서의 fill { , } , 또는 : 이외의 모든 문자입니다.

width 표준 형식 너비 명세 에 설명되어 있습니다.

n 옵션은 범위가 여는 괄호와 닫는 괄호 없이 포맷되도록 합니다.

assert(std::format("{}", views::iota(1, 5)) == "[1, 2, 3, 4]");
assert(std::format("{:n}", views::iota(1, 5)) == "1, 2, 3, 4");

range-underlying-spec 내의 format-spec (문법은 : format-spec 와 동일함)이 있는 경우, 이는 범위 요소 포매터 std::formatter<T, CharT> 에 의해 해석됩니다.

std::array ints{12, 10, 15, 14};
assert(std::format("{}", ints) == "[12, 10, 15, 14]");
assert(std::format("{::X}", ints) == "[C, A, F, E]");
assert(std::format("{:n:_^4}", ints) == "_12_, _10_, _15_, _14_");

range-type 은 범위의 서식 지정 방식을 변경하며, 특정 옵션들은 특정 인수 유형에서만 유효합니다.

사용 가능한 범위 표현 유형은 다음과 같습니다:

  • m : 여는 괄호가 "{" 이고, 닫는 괄호가 "}" 이며, 구분자가 ", " 이어야 함을 나타냅니다. 또한 각 범위 요소는 m 이 해당 tuple-type 에 대해 지정된 것처럼 포맷되어야 합니다( tuple-format-spec 참조).
  • m range-type 으로 선택된 경우, T 가 다음 중 하나의 특수화(specialization)가 아니라면 프로그램은 ill-formed입니다:
std::array char_pairs
{
    std::pair{'A', 5}, std::pair{'B', 10}, std::pair{'C', 12}
};
assert(std::format("{}", char_pairs) == "[('A', 5), ('B', 10), ('C', 12)]");
assert(std::format("{:m}", char_pairs) == "{'A': 5, 'B': 10, 'C': 12}");
  • s : 범위가 문자열로 포맷되어야 함을 나타냅니다.
  • ?s : 범위가 이스케이프된 문자열 로 포맷되어야 함을 나타냅니다.
  • s 또는 ?s range-type 으로 선택된 경우, n 옵션과 range-underlying-spec 은 형식 지정자에 포함되어서는 안 되며,
  • T CharT 가 아닌 경우 프로그램은 형식이 잘못됩니다.
std::array star{'S', 'T', 'A', 'R'};
assert(std::format("{}", star) == "['S', 'T', 'A', 'R']");
assert(std::format("{:s}", star) == "STAR");
assert(std::format("{:?s}", star) == "\"STAR\"");

데이터 멤버

멤버 이름 정의
std:: formatter < T, CharT > underlying_ (private) 요소들을 위한 기본 포매터
( 설명 전용 멤버 객체* )
std:: basic_string_view < CharT > separator_ (private) 범위 포맷 결과의 구분자를 나타내는 문자열. 기본 구분자는 ", " 입니다.
( 설명 전용 멤버 객체* )
std:: basic_string_view < CharT > opening-bracket_ (private) 범위 포맷 결과의 여는 괄호를 나타내는 문자열. 기본 여는 괄호는 "[" 입니다.
( 설명 전용 멤버 객체* )
std:: basic_string_view < CharT > closing-bracket_ (private) 범위 포맷 결과의 닫는 괄호를 나타내는 문자열. 기본 닫는 괄호는 "]" 입니다.
( 설명 전용 멤버 객체* )

멤버 함수

set_separator
범위 형식화 결과에 지정된 구분자를 설정합니다
(public member function)
set_brackets
범위 형식화 결과에 지정된 여는 괄호와 닫는 괄호를 설정합니다
(public member function)
underlying
기본 포매터를 반환합니다
(public member function)
parse
range-format-spec 에 지정된 형식 지정자를 구문 분석합니다
(public member function)
format
range-format-spec 에 지정된 대로 범위 형식화 출력을 작성합니다
(public member function)

std::range_formatter:: set_separator

constexpr void set_separator ( std:: basic_string_view < CharT > sep ) noexcept ;

sep separator_ 에 할당합니다.

std::range_formatter:: set_brackets

constexpr void set_brackets ( std:: basic_string_view < CharT > opening,
std:: basic_string_view < CharT > closing ) noexcept ;

opening closing 을 각각 opening-bracket_ closing-bracket_ 에 할당합니다.

std::range_formatter:: underlying

constexpr std:: formatter < T, CharT > & underlying ( ) ;
(1)
constexpr const std:: formatter < T, CharT > & underlying ( ) const ;
(2)

underlying_ (기본 포매터)를 반환합니다.

std::range_formatter:: parse

template < class ParseContext >
constexpr auto parse ( ParseContext & ctx ) - > ParseContext :: iterator ;

형식 지정자를 range-format-spec 으로 파싱하고 파싱된 지정자를 현재 객체에 저장합니다.

underlying_ . parse ( ctx ) 를 호출하여 range-format-spec 내의 format-spec 을 파싱하거나, 해당 내용이 없는 경우 빈 format-spec 을 파싱합니다.

range-type 또는 n 옵션이 존재하는 경우, opening-bracket_ , closing-bracket_ , separator_ 의 값이 필요에 따라 수정됩니다.

다음 조건을 모두 만족할 경우 underlying_ . set_debug_format ( ) 를 호출합니다:

  • range-type s ?s 도 아닌 경우
  • underlying_ . set_debug_format ( ) 가 유효한 표현식인 경우
  • range-underlying-spec 이 존재하지 않는 경우

range-format-spec 의 끝을 지난 반복자를 반환합니다.

std::range_formatter:: format

template < ranges:: input_range R, class FormatContext >

requires std:: formattable < ranges:: range_reference_t < R > , CharT > &&
std:: same_as < std:: remove_cvref_t < ranges:: range_reference_t < R >> , T >

auto format ( R && r, FormatContext & ctx ) const - > FormatContext :: iterator ;

range-type s 또는 ?s 인 경우, 각각 문자열 또는 이스케이프된 문자열로 포맷된 std:: basic_string < CharT > ( std:: from_range , r ) ctx. out ( ) 에 기록합니다.

그렇지 않은 경우, range-format-spec 에 지정된 대로 다음을 순서대로 ctx. out ( ) 에 기록합니다:

  • opening-bracket_ ,
  • 범위 r 의 각 포맷 가능한 요소 e 에 대해:
  • underlying_ 을 통해 e 를 기록한 결과, 그리고
  • e r 의 마지막 요소가 아닌 경우 separator_ ,
  • closing-bracket_ .

출력 범위의 끝을 지난 반복자를 반환합니다.

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 3892 C++23 중첩 범위의 서식 지정이 올바르지 않았음 수정됨

참고 항목

(C++20)
주어진 타입에 대한 서식 규칙을 정의함
(클래스 템플릿)