namespace std {
template<class... Args>
size_t
formatted_size(format_string<Args...> fmt,
Args&&... args); // (1) C++20
template<class... Args>
constexpr size_t
formatted_size(format_string<Args...> fmt,
Args&&... args); // (1) C++26
template<class... Args>
size_t
formatted_size(wformat_string<Args...> fmt,
Args&&... args); // (2) C++20
template<class... Args>
constexpr size_t
formatted_size(wformat_string<Args...> fmt,
Args&&... args); // (2) C++26
template<class... Args>
size_t
formatted_size(const locale& loc,
format_string<Args...> fmt,
Args&&... args); // (3) C++20
template<class... Args>
size_t
formatted_size(const locale& loc,
wformat_string<Args...> fmt,
Args&&... args); // (4) C++20
}
概要
書式文字列fmtに従ったフォーマットでargs...の文字列表現を格納するために必要な文字数を返す。
- (1): マルチバイト文字列版
- (2): ワイド文字列版
- (3): マルチバイト文字列版 (ロケール指定あり)
- (4): ワイド文字列版 (ロケール指定あり)
formatted_size("The answer is {}.", 42); // => 17
適格要件
- 書式文字列は定数式であり、
string_view(ワイド文字列版はwstring_view)に暗黙変換できること。 - 書式文字列にエラーがないこと。例えば、
- 閉じていないカッコなどの構文エラーがないこと。
- 実際に渡している引数の型が書式文字列中の置換フィールドが要求する型に合うこと。
事前条件
charTをdecltype(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
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??
参照
- Working Draft, Standard for Programming Language C++ [format]
- P0645R10 Text Formatting
- P2216R3 std::format improvements
- [C++] std::formatあるいは{fmt}のコンパイル時フォーマット文字列チェックの魔術 - 地面を見下ろす少年の足蹴にされる私
- P2418R2 Add support for
std::generator-like types tostd::format - P3391R2
constexpr std::format- C++26から非ロケール版が
constexprに対応した
- C++26から非ロケール版が