現代的な書式設定ライブラリ

安全性

Pythonの書式設定機能に着想を得た{fmt}は、printf系の関数を安全に置き換えます。Cで脆弱性の一般的な原因となる書式文字列の誤りは、コンパイル時に報告されます。例:

fmt::format("{:d}", "I am not a number");
このコードはコンパイル時エラーになります。dは文字列に使える書式指定子ではないためです。 fmt::formatなどのAPIは、自動メモリー管理によってバッファーオーバーフローエラーを防ぎます。

→ 詳細を見る

拡張性

ほとんどの標準型(すべてのコンテナー、日付、時刻を含む)の書式設定を標準でサポートします。例:

fmt::print("{}", std::vector{1, 2, 3});
このコードは、ベクトルをJSONに似た形式で出力します:
[1, 2, 3]
独自の型も書式設定できるようにすることができ、その型に対してコンパイル時チェックを機能させることもできます。

→ 詳細を見る

性能

{fmt}は、数十パーセントから20〜30倍高速になる可能性があります。比較対象はiostreamsやsprintfで、特に数値の書式設定で効果があります。 このライブラリは動的メモリー確保を最小限に抑えます。また、必要に応じて書式文字列をコンパイルして最適なコードにできます。

Unicodeサポート

{fmt}は移植性のあるUnicodeサポートを主要なOSで提供します。UTF-8のchar文字列を扱えます。例:

fmt::print("Слава Україні!");
このコードは、コードページにかかわらず、Linux、macOS、さらにはWindowsのコンソールでも正しく出力されます。

既定ではロケールに依存しませんが、ローカライズされた書式設定を選ぶこともできます。{fmt}はこれをUnicodeで機能させ、標準ライブラリにある問題に対処します。

高速なコンパイル

このライブラリは型消去を多用してコンパイルを高速化します。fmt/base.hは、インクルードへの依存を最小限に抑えたAPIのサブセットを提供し、*printfのすべての用途を置き換えるのに十分な機能を備えています。

{fmt}を使ったコードは通常、同等のiostreamsコードより数倍速くコンパイルできます。printfはさらに速くコンパイルできますが、その差は縮まりつつあります。

→ 詳細を見る

小さなバイナリーサイズ

型消去はテンプレートの肥大化を防ぐためにも使われ、呼び出しごとのバイナリーコードをコンパクトにします。たとえば、fmt::printを引数1つで呼び出すと、わずか数命令になります。これはprintfに匹敵します。実行時の安全性を加えていてもこの程度であり、同等のiostreamsコードよりはるかに小さくなります。

ライブラリ自体のバイナリーサイズも小さく、浮動小数点数の書式設定など一部のコンポーネントを無効にすれば、資源に制約のあるデバイス向けにさらに小さくできます。

移植性

{fmt}は、小さく自己完結したコードベースを持ちます。中核はわずか3つのヘッダーで構成され、外部依存はありません。

移植性が高く、必要なのは最小限のC++11の機能の一部だけです。これらの機能はGCC 4.9、Clang 3.6、MSVC 19.10(2017)以降で利用できます。新しいコンパイラーや標準ライブラリの機能が利用可能な場合はそれを使い、追加の機能を提供します。

可能な範囲で、書式設定関数の出力はプラットフォーム間で一致します。

オープンソース

{fmt}はGitHubのオープンソースC++ライブラリの上位100件に入り、これまでに数百人の貢献者が参加しています。

このライブラリは、寛容なMITライセンスで配布され、多くのオープンソースプロジェクトで利用されています。Blender、PyTorch、AppleのFoundationDB、Windows Terminal、MongoDBなどがその例です。