名前空間
変種
操作

std::range_formatter

From 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 は、 range-fill-and-alignfill{}、または : 以外の文字である場合を除き、 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-specm が指定されたかのようにフォーマットされます。
  • mrange-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 または ?srange-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\"");

[編集] データメンバー

メンバ名 定義
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;

sepseparator_ に代入します。

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 としてフォーマット指定子を解析し、解析された指定子を現在のオブジェクトに格納します。

range-format-spec 内の format-spec を解析するために underlying_.parse(ctx) を呼び出すか、後者が存在しない場合は空の format-spec を呼び出します。

range-type または n オプションが存在する場合、 opening-bracket_closing-bracket_、および separator_ の値は必要に応じて変更されます。

次の場合に underlying_.set_debug_format() を呼び出します。

  • range-types でも ?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++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3892 C++23 ネストされた範囲のフォーマットが正しくありませんでした。 修正済み

[編集] 関連項目

(C++20)
与えられた型のフォーマット規則を定義する
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)