名前空間
変種
操作

std::print(std::ostream)

From cppreference.com
< cpp‎ | io‎ | basic_ostream
 
 
 
 
ヘッダ<ostream>で定義
template< class... Args >
void print( std::ostream& os, std::format_string<Args...> fmt, Args&&... args );
(C++23から)

フォーマット文字列 fmt に従って args をフォーマットし、その結果を os ストリームに挿入します。

「通常の」リテラルエンコーディングがUTF-8である場合、以下と同等です。

Args のいずれかの `Ti` に対して std::formatter<Ti, char>std::make_format_args で要求される BasicFormatter の要件を満たさない場合、動作は未定義です。

目次

[編集] パラメータ

os - データを挿入する出力ストリーム
fmt - フォーマット文字列を表すオブジェクト。フォーマット文字列は以下で構成される:
  • 通常の文字({} を除く)は、変更されずに出力にコピーされる。
  • エスケープシーケンス {{}} は、それぞれ出力で {} に置き換えられる。
  • 置換フィールド。

各置換フィールドは以下の形式を持つ。

{ arg-id (オプション) } (1)
{ arg-id (オプション) : format-spec } (2)
1) フォーマット指定なしの置換フィールド
2) フォーマット指定ありの置換フィールド
arg-id - フォーマットに使用する args 内の引数のインデックスを指定する。省略された場合、引数は順番に使用される。

フォーマット文字列内の arg-id は、すべて存在するか、すべて省略されなければならない。手動と自動のインデックス付けを混在させることはエラーである。

format-spec - 対応する引数に対する std::formatter 特殊化によって定義されるフォーマット指定。} で開始することはできない。

(C++23から)
(C++26以降)
  • その他のフォーマット可能な型の場合、フォーマット指定はユーザー定義の formatter 特殊化によって決定される。
args... - フォーマットする引数

[編集] 例外

  • アロケーションに失敗した場合、std::bad_alloc
  • os.exceptions() の値に関係なく、また os のエラー状態に ios_base::badbit を設定することなく、いずれかの formatter によってスローされた例外(例: std::format_error)を伝播します。
  • os への挿入が失敗した場合に呼び出される os.setstate(ios_base::badbit) によって引き起こされる ios_base::failure をスローする可能性があります。

[編集] 注記

機能テストマクロ 規格 機能
__cpp_lib_print 202207L (C++23) 書式付き出力
__cpp_lib_format 202207L (C++23) std::basic_format_string の公開

[編集]

#include <array>
#include <cctype>
#include <cstdio>
#include <format>
#include <numbers>
#include <ranges>
#include <sstream>
 
int main()
{
    std::array<char, 24> buf;
    std::format_to(buf.begin(), "{:.15f}", std::numbers::sqrt2);
 
    unsigned num{}, sum{};
 
    for (auto n : buf
                | std::views::filter(isdigit)
                | std::views::transform([](char x) { return x - '0'; })
                | std::views::take_while([&sum](char) { return sum < 42; }))
        sum += n, ++num;
 
    std::stringstream stream;
 
#ifdef __cpp_lib_print
    std::print(stream,
#else
    stream << std::format(
#endif
        "√2 \N{ALMOST EQUAL TO} {0}.\n"
        "The sum of its first {1} digits is {2}.",
        std::numbers::sqrt2, num, sum
    );
 
    std::puts(stream.str().data());
}

出力

√2 ≈ 1.4142135623730951.
The sum of its first 13 digits is 42.

[編集] 関連項目

引数の書式化された表現に'\n'を付加して出力する
(関数テンプレート) [編集]
(C++23)
引数の書式化された表現を用いて、stdoutまたはファイルストリームに出力する
(関数テンプレート) [編集]
(C++20)
引数のフォーマット済み表現を新しい文字列に格納する
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)