Skip to content

Latest commit

 

History

History
79 lines (60 loc) · 2.85 KB

File metadata and controls

79 lines (60 loc) · 2.85 KB

formatter

  • system_error[meta header]
  • std[meta namespace]
  • class[meta id-type]
  • cpp29[meta cpp]
namespace std {
  template <class charT>
  struct formatter<error_code, charT>;
}

概要

error_codeクラスに対するstd::formatterクラステンプレートの特殊化。

フォーマットフラグとしては、以下を使用できる:

[[fill] [align] [width]] [?] [s]
  • デフォルトでは、ストリーム出力と同じ「カテゴリ名:エラー値」の形式(例:generic:2)で出力される
  • sを指定すると、message()で得られるエラーメッセージが出力される
    • charTcharであり、通常の文字列リテラルのエンコーディングがUTF-8である場合、メッセージはUTF-8へ変換され、不正なバイト列はU+FFFD(置換文字)に置き換えられる
  • ?を指定すると、デバッグ出力としてエラーコード全体が引用符で囲まれたエスケープ文字列として出力される
    • カテゴリ名とエラー値を区切る:が、連想コンテナのフォーマット出力におけるキーと値の区切りの:と紛らわしくなることを避けられる

備考

  • ストリーム出力のoperator<<では、std::setw()などの入出力マニピュレータがカテゴリ名だけに適用されてしまう問題があった。このformatter特殊化では、幅や整列の指定はエラーコード全体に適用される
  • エラー値のみを出力するためのフラグは提供されない。エラー値はカテゴリの情報がなければ有用性が低く、必要であればec.value()を直接フォーマットすればよいためである

#include <format>
#include <iostream>
#include <system_error>

int main()
{
  std::error_code ec = std::make_error_code(std::errc::no_such_file_or_directory);

  std::cout << std::format("{}", ec) << std::endl;
  std::cout << std::format("[{:>12}]", ec) << std::endl;
  std::cout << std::format("{:?}", ec) << std::endl;
  std::cout << std::format("{:s}", ec) << std::endl;
}
  • std::make_error_code[link /reference/system_error/make_error_code.md]
  • std::errc[link /reference/system_error/errc.md]

出力例

generic:2
[   generic:2]
"generic:2"
No such file or directory

バージョン

言語

  • C++29

処理系

関連項目

参照