이 페이지는 C++20에서 도입된 텍스트 서식 지정 라이브러리(utility_format)에 대해 다루고 있어요. 이 라이브러리는 printf 함수 계열에 대한 안전하고 확장 가능한 대안을 제공하며, 기존 C++ I/O 스트림 라이브러리를 보완하는 역할을 해요. 서식 지정 사양, 서식 함수, 서식 문자열, 관련 개념과 확장 지원 구성 요소를 살펴볼게요.
출처: cppreference
본문
서식 지정 사양은 객체를 다양한 종류의 옵션으로 서식 지정하는 방법을 지정해요.
기본 타입과 표준 문자열 타입의 객체 서식 지정은 기본 서식 지정 사양을 사용해요. 다른 라이브러리 구성 요소는 자체 서식 지정 사양을 제공할 수도 있으며, 자세한 내용은 여기를 참조해요.
<format> 헤더에 정의됨 |
| format (C++20) |
| format_to (C++20) |
| format_to_n (C++20) |
| formatted_size (C++20) |
<format> 헤더에 정의됨 |
| basic_format_string format_string wformat_string (C++20) (C++20) (C++20) |
| dynamic_format (C++26) |
<format> 헤더에 정의됨 |
| formattable (C++23) |
확장 지원 및 구현 세부 사항 (Extensibility support and implementation detail)
<format> 헤더에 정의됨 |
| vformat (C++20) |
| vformat_to (C++20) |
| make_format_args make_wformat_args (C++20) (C++20) |
| visit_format_arg (C++20) (C++26에서 폐지됨) |
| formatter (C++20) |
| range_formatter (C++23) |
| enable_nonlocking_formatter_optimization (C++23) |
| range_format (C++23) |
| format_kind (C++23) |
| basic_format_arg (C++20) |
| basic_format_args format_args wformat_args (C++20) (C++20) (C++20) |
| basic_format_context format_context wformat_context (C++20) (C++20) (C++20) |
| basic_format_parse_context format_parse_context wformat_parse_context (C++20) (C++20) (C++20) |
| format_error (C++20) |
도우미 항목 (Helper items) (C++23부터)
| template < class R , class CharT > concept /const-formattable-range/ = ranges :: input_range < const R > && std :: formattable < ranges :: range_reference_t < const R > , CharT > ; |
(1) |
(설명 전용*) |
| template < class R , class CharT > using /fmt-maybe-const/ = std :: conditional_t < /const-formattable-range/ < R , CharT > , const R , R > ; |
(2) |
(설명 전용*) |
참고 사항 (Notes)
| 기능 테스트 매크로 |
값 |
표준 |
기능 |
| __cpp_lib_format |
201907L |
(C++20) |
텍스트 서식 지정 |
| 202106L |
(C++23) (DR20) |
컴파일 타임 서식 문자열 검사; std::vformat_to의 매개변수화 축소 |
|
| 202110L |
(C++23) (DR20) |
chrono formatter의 로캘 처리 수정; const-formattable이 아닌 타입 지원 |
|
| 202207L |
(C++23) (DR20) |
std::basic_format_string 노출; chrono 타입의 지역화된 서식 지정에서 인코딩 처리 명확화 |
|
| 202304L |
(C++26) |
포인터 서식 지정 |
|
| 202305L |
(C++26) |
서식 인자 타입 검사 |
|
| 202306L |
(C++26) |
멤버 std::basic_format_arg::visit |
|
| 202311L |
(C++26) |
런타임 서식 문자열 |
|
| 202603L |
(C++26) |
std::runtime_format을 std::dynamic_format으로 이름 변경 |
|
| __cpp_lib_format_ranges |
202207L |
(C++23) |
범위 서식 지정 |
| __cpp_lib_format_path |
202403L |
(C++26) |
std::filesystem::path 서식 지정 |
| __cpp_lib_format_uchar |
202311L |
(C++26) |
코드 유닛을 정수로 서식 지정하는 문제 수정 |
| __cpp_lib_formatters |
202302L |
(C++23) |
std::thread::id 및 std::stacktrace 서식 지정 |
우리는 std::basic_format_string의 추가(P2508)를 결함 보고서로 의도적으로 처리해요. 알려진 모든 구현이 C++20 모드에서 이러한 구성 요소를 제공하지만 공식적으로 그렇게 분류되지는 않기 때문이에요.
예제 (Example)
#include <cassert>
#include <format>
int main()
{
std::string message = std::format("The answer is {}.", 42);
assert(message == "The answer is 42.");
}
결함 보고서 (Defect reports)
다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용되었어요.
| DR |
적용 대상 |
발표된 동작 |
올바른 동작 |
| P2418R2 |
C++20 |
const-formattable도 아니고 복사 가능하지도 않은 객체(예: generator 유사 객체)는 서식 지정할 수 없음 |
이러한 객체의 서식 지정을 허용 (완화된 formatter 요구 사항) |
| P2508R1 |
C++20 |
이 기능에 대한 사용자에게 보이는 이름이 없음 |
basic_format_string 이름이 노출됨 |
같이 보기 (See also)
| print (C++23) |
인자의 서식 지정 표현을 사용하여 stdout 또는 파일 스트림에 출력해요 (함수 템플릿) [edit] |
| println (C++23) |
각 출력이 추가 줄바꿈으로 종료되는 점을 제외하면 std::print와 동일해요 (함수 템플릿) [edit] |
| print (std::ostream) (C++23) |
인자의 서식 지정 표현을 출력해요 (함수 템플릿) [edit] |
더 알아보기 (Learn more)
cppreference