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

履歴 編集

function template
<format>

std::formatted_size(C++20)

namespace std {
  template<class... Args>
  size_t formatted_size(format_string<Args...> fmt, Args&&... args); // (1)

  template<class... Args>
  size_t formatted_size(wformat_string<Args...> fmt, Args&&... args); // (2)

  template<class... Args>
  size_t formatted_size(const locale& loc, format_string<Args...> fmt, Args&&... args); // (3)

  template<class... Args>
  size_t formatted_size(const locale& loc, wformat_string<Args...> fmt, Args&&... args); // (4)
}

概要

書式文字列fmtに従ったフォーマットでargs...の文字列表現を格納するために必要な文字数を返す。

  • (1): マルチバイト文字列版
  • (2): ワイド文字列版
  • (3): マルチバイト文字列版 (ロケール指定あり)
  • (4): ワイド文字列版 (ロケール指定あり)

formatted_size("The answer is {}.", 42); // => 17

適格要件

  • 書式文字列は定数式であり、string_view(ワイド文字列版はwstring_view)に暗黙変換できること。
  • 書式文字列にエラーがないこと。例えば、
    • 閉じていないカッコなどの構文エラーがないこと。
    • 実際に渡している引数の型が書式文字列中の置換フィールドが要求する型に合うこと。

事前条件

charTdecltype(fmt)::value_typeとして、

  • Argsのそれぞれの引数Tiに対応するフォーマッターformatter<remove_cvref_t<Ti>, charT>BasicFormatter要件を満たす。

戻り値

書式文字列fmtに従ったフォーマットでargs...の文字列表現を格納するために必要な文字数。

例外

書式文字列が正しくなかったり、フォーマット実行時に失敗したりした場合、format_errorを投げる。

備考

マルチバイト文字列、ワイド文字列の区別は、可変長引数部分で受け取れる文字列の型にも適用される。

#include <iostream>
#include <format>

int main()
{
  std::cout << std::formatted_size("The answer is {}.", 42) << std::endl;
}

出力

17

実装例

template<class CharT>
class Counter {
  size_t count_ = 0;
public:
  using value_type = CharT;

  constexpr void push_back(const value_type&) {
    count_++;
  }

  constexpr size_t size() const {
    return count_;
  }
};

template<class Out, class... Args>
size_t formatted_size(format_string<Args...> fmt, const Args&... args) {
  Counter<char> counter;
  format_to(back_inserter(counter), fmt, forward<Args>(args)...);
  return counter.size();
}

template<class Out, class... Args>
size_t formatted_size(wformat_string<Args...> fmt, const Args&... args) {
  Counter<wchar_t> counter;
  format_to(back_inserter(counter), fmt, forward<Args>(args)...);
  return counter.size();
}

template<class Out, class... Args>
size_t formatted_size(const locale& loc, format_string<Args...> fmt, const Args&... args) {
  Counter<char> counter;
  format_to(loc, back_inserter(counter), fmt, forward<Args>(args)...);
  return counter.size();
}

template<class Out, class... Args>
size_t formatted_size(const locale& loc, wformat_string<Args...> fmt, const Args&... args) {
  Counter<wchar_t> counter;
  format_to(loc, back_inserter(counter), fmt, forward<Args>(args)...);
  return counter.size();
}

バージョン

言語

  • C++20

処理系

参照