名稱空間
變體
操作

std::range_formatter

來自 cppreference.com
< cpp‎ | utility‎ | format
 
 
 
 
定義於標頭檔案 <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: 表示開括號應為 "{",閉括號應為 "}",分隔符應為 ", ",並且每個範圍元素應格式化,如同為其 tuple-type(在 tuple-format-spec 中)指定了 m
  • 如果選擇 m 作為 range-type,則除非 T 是以下特化之一,否則程式是非良構的:
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,並且
  • 除非 TCharT,否則程式是非良構的。
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\"");

[編輯] 資料成員

成員名稱 (Member name) 定義
std::formatter<T, CharT> underlying_ (私有) 元素的底層格式化器
(僅用於闡釋的成員物件*)
std::basic_string_view<CharT> separator_ (私有) 表示範圍格式化結果分隔符的字串。預設分隔符為 ", "
(僅用於闡釋的成員物件*)
std::basic_string_view<CharT> opening-bracket_ (私有) 表示範圍格式化結果開括號的字串。預設開括號為 "["
(僅用於闡釋的成員物件*)
std::basic_string_view<CharT> closing-bracket_ (私有) 表示範圍格式化結果閉括號的字串。預設閉括號為 "]"
(僅用於闡釋的成員物件*)

[編輯] 成員函式

set_separator
為範圍格式化結果設定指定的分隔符
(公開成員函式)
set_brackets
為範圍格式化結果設定指定的開括號和閉括號
(公開成員函式)
underlying
返回底層格式化器
(公開成員函式)
parse
range-format-spec 指定解析格式說明符
(公開成員函式)
format
range-format-spec 指定寫入範圍格式化輸出
(公開成員函式)

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;

分別將 openingclosing 賦值給 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-typen 選項,則根據需要修改 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-types?s,它分別將格式化的 std::basic_string<CharT>(std::from_range, r) 作為字串或跳脫字元串寫入 ctx.out()

否則,它將按照 range-format-spec 指定的順序將以下內容寫入 ctx.out()

  • opening-bracket_,
  • 對於範圍 r 的每個可格式化元素 e
  • 透過 underlying_ 寫入 e 的結果,以及
  • separator_,除非 er 的最後一個元素,以及
  • closing-bracket_.

返回一個迭代器,指向輸出範圍的末尾之後。

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3892 C++23 巢狀範圍的格式化不正確 已更正

[編輯] 另請參閱

(C++20)
定義給定型別的格式化規則
(類模板) [編輯]