最終更新日時(UTC):
が更新

履歴 編集

class template
<format>

std::formatter(C++20)

namespace std {
  template<class T, class U>
  struct formatter;
}

概要

フォーマット引数の個々の型に対応する書式文字列の解析と値のフォーマットを担うクラス。

charTcharまたはwchar_tとすると、標準で次の特殊化が有効である。

  1. 以下のもの。

template<> struct formatter<charT, charT>;

template<> struct formatter<char, wchar_t>;

template<> struct formatter<charT*, charT>;

template<> struct formatter<const charT*, charT>;

template<size_t N> struct formatter<const charT[N], charT>;

template<class traits, class Allocator>
struct formatter<basic_string<charT, traits, Allocator>, charT>;

template<class traits>
struct formatter<basic_string_view<charT, traits>, charT>;

  1. 第1テンプレート引数がnullptr_t, void*, const void*, bool, すべてのCV修飾されない標準の整数型, 拡張整数型, 浮動小数点数型であり、第2テンプレート引数がcharTであるもの。

さらに、ユーザーがformatterを特殊化した場合、それも有効である。

標準でもユーザー定義でも特殊化されない場合、その型に対するformatterは無効であり、そのような型はフォーマット関数の引数にできない。

ワイド文字列とマルチバイト文字列を相互に変換するような特殊化は意図的に用意されていないが、ユーザーが用意することは禁止していない。

Formatter要件

formatterの有効な特殊化はFormatter要件を満たす必要がある。

FがFormatter要件を満たすとは、次のことをいう。

  • FCpp17DefaultConstructibleCpp17CopyConstructibleCpp17CopyAssignableCpp17Destructibleであること (注: ここはC++20の策定までにコンセプトで書き換えられるかもしれない)

さらに、

  1. f.parse(pc) が有効であり、
    • 戻り値の型がPC::iteratorである
    • [pc.begin(), pc.end())の範囲を解析してformat_errorを投げるか、解析が終わった位置を指すイテレーターを返す
  2. f.format(t, fc) が有効であり、
    • 戻り値の型がFC::iteratorである
    • フォーマット結果をfc.out()へ出力し、出力後のイテレーターを返す
    • 出力はt、グローバルロケール、最後に呼び出されたf.parse(pc)[pc.begin(), pc.end())の範囲以外に依存しない
  3. f.format(u, fc) が有効であり、
    • 戻り値がFC::iteratorである
    • フォーマット結果をfc.out()へ出力し、出力後のイテレーターを返す
    • 出力はt、グローバルロケール、最後に呼び出されたf.parse(pc)[pc.begin(), pc.end())の範囲以外に依存しない
    • uを変更しない

ただし、

  • 文字の型をcharT
  • 出力イテレーターの型をOut
  • フォーマット引数の型をT
  • fFのオブジェクト
  • uTのlvalue
  • tTまたはconst Tへ変換できる型のオブジェクト
  • PCbasic_format_parse_context<charT>
  • FCbasic_format_context<Out, charT>
  • pcPCのlvalue
  • fcFCのlvalue
  • pc.begin()は書式文字列中の対応する置換フィールドのオプションの先頭を指す
  • オプションが空なら、pc.begin() == pc.end()または*pc.begin() == '}'である

とする。

#include <iostream>
#include <format>

enum color { red, green, blue };

const char* color_names[] = { "red", "green", "blue" };

template<> struct std::formatter<color> : std::formatter<const char*> {
  auto format(color c, format_context& ctx) {
    return formatter<const char*>::format(color_names[c], ctx);
  }
};

int main()
{
  int variable = 0;
  std::cout << std::format("{}", red) << std::endl;
}

出力

red

バージョン

言語

  • C++20

処理系

参照