std::formatted_size
From cppreference.com
| ヘッダー <format> で定義 |
||
| template< class... Args > std::size_t formatted_size( std::format_string<Args...> fmt, Args&&... args ); |
(1) | (C++20以降) |
| template< class... Args > std::size_t formatted_size( std::wformat_string<Args...> fmt, Args&&... args ); |
(2) | (C++20以降) |
| template< class... Args > std::size_t formatted_size( const std::locale& loc, |
(3) | (C++20以降) |
| template< class... Args > std::size_t formatted_size( const std::locale& loc, |
(4) | (C++20以降) |
フォーマット文字列 fmt に従って引数 args をフォーマットし、フォーマットされた文字列の総文字数を決定します。指定されている場合、loc はロケール固有のフォーマットに使用されます。
Args の任意の Ti について、std::formatter<std::remove_cvref_t<Ti>, CharT> が BasicFormatter の要件を満たさない場合、動作は未定義です。
目次 |
[編集] パラメータ
| fmt | - | フォーマット文字列を表すオブジェクト。フォーマット文字列は以下で構成される:
各置換フィールドは以下の形式を持つ。
1) フォーマット指定なしの置換フィールド
2) フォーマット指定ありの置換フィールド
| ||||||||||||||||||||||||||||||||||||||||||||||
| args... | - | フォーマットする引数 | ||||||||||||||||||||||||||||||||||||||||||||||
| loc | - | ロケール固有のフォーマットに使用される std::locale | ||||||||||||||||||||||||||||||||||||||||||||||
[編集] 戻り値
フォーマットされた文字列の総文字数。
[編集] 例外
フォーマッタによってスローされた例外を伝播します。
[編集] 例
このコードを実行
#include <format> #include <iomanip> #include <iostream> #include <string_view> #include <vector> int main() { using namespace std::literals::string_view_literals; constexpr auto fmt_str{"Hubble's H{0} {1} {2:*^4} miles/sec/mpc."sv}; constexpr auto sub_zero{"\N{SUBSCRIPT ZERO}"sv}; // "₀" or {0342, 130, 128} constexpr auto aprox_equ{"\N{APPROXIMATELY EQUAL TO}"sv}; // "≅" or {0342, 137, 133} constexpr int Ho{42}; // H₀ const auto min_buffer_size{std::formatted_size(fmt_str, sub_zero, aprox_equ, Ho)}; std::cout << "Min buffer size = " << min_buffer_size << '\n'; // Use std::vector as dynamic buffer. The buffer does not include the trailing '\0'. std::vector<char> buffer(min_buffer_size); std::format_to_n(buffer.data(), buffer.size(), fmt_str, sub_zero, aprox_equ, Ho); std::cout << "Buffer: " << std::quoted(std::string_view{buffer.data(), min_buffer_size}) << '\n'; // Print the buffer directly after adding the trailing '\0'. buffer.push_back('\0'); std::cout << "Buffer: " << std::quoted(buffer.data()) << '\n'; }
出力
Min buffer size = 37 Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc." Buffer: "Hubble's H₀ ≅ *42* miles/sec/mpc."
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2216R3 | C++20 | 無効なフォーマット文字列に対して std::format_error をスローします。 | 無効なフォーマット文字列はコンパイル時エラーになります。 |
| P2418R2 | C++20 | const-usableでもコピー可能でもないオブジェクト (ジェネレータのようなオブジェクトなど)はフォーマットできない |
これらのオブジェクトのフォーマットを許可する |
| P2508R1 | C++20 | この機能にはユーザーから見える名前がない | basic_format_stringという名前が公開された |
[編集] 関連項目
| (C++20) |
引数のフォーマット済み表現を出力イテレータを介して書き出す (関数テンプレート) |
| (C++20) |
指定されたサイズを超えないように、引数のフォーマット済み表現を出力イテレータを介して書き出す (関数テンプレート) |