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
)に暗黙変換できること。 - 書式文字列にエラーがないこと。例えば、
- 閉じていないカッコなどの構文エラーがないこと。
- 実際に渡している引数の型が書式文字列中の置換フィールドが要求する型に合うこと。
事前条件
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++: ??