std::range_formatter
| ヘッダー <format> で定義 |
||
| template< class T, class CharT = char > requires std::same_as<std::remove_cvref_t<T>, T> && std::formattable<T, CharT> |
(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 は、 range-fill-and-align の fill が {、}、または : 以外の文字である場合を除き、 fill-and-align と同じように解釈されます。
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-format-spec のmが指定されたかのようにフォーマットされます。
mが range-type として選択された場合、プログラムは、Tが次のいずれかの特殊化である場合を除き、不正な形式となります。
- std::pair、または
- std::tuple であり、 std::tuple_size_v<T> == 2 が true である場合。
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 としてフォーマット指定子を解析し、解析された指定子を現在のオブジェクトに格納します。
range-format-spec 内の format-spec を解析するために underlying_.parse(ctx) を呼び出すか、後者が存在しない場合は空の 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> && |
||
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 を書き出した結果、および-
separator_(ただし、 e が r の最後の要素である場合を除く)、および
-
closing-bracket_.
出力範囲の末尾以降のイテレータを返します。
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3892 | C++23 | ネストされた範囲のフォーマットが正しくありませんでした。 | 修正済み |
[編集] 関連項目
| (C++20) |
与えられた型のフォーマット規則を定義する (クラステンプレート) |