問題タブ [fmt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 承認試験用STLコンテナの印刷に関する規約
優れたApprovalTests.cppライブラリを使用して承認テストを作成しています。このライブラリは、関数からの結果の「スナップショット」の生成を自動化します。スナップショットはT
、ostream& operator<< (T val)
.
この演算子は常に、ある値をテキスト表現にフォーマットするための C++ 規則でした。プリミティブ型はこの演算子をサポートしており、カスタム型の独自の実装を作成できますが、 のような STL コンテナーの標準実装はありませんstd::vector
。
fmt
や などの他のライブラリを使用しても、独自のものを実装できますpprint
。同様の出力の例を次に示します。ApprovalTests.cpp で推奨されてSTREAM
いる具象型の代わりにジェネリック型をパラメーターとして使用していますが、考え方は変わりません。ostream
for ループ
ostream_iterator
fmt
ヘッダー<fmt/ranges.h
付き:
プリティプリント
https://github.com/p-ranav/pprint
cxx-prettyprint
prettyprint.hppをインクルードするだけで、STL コンテナーで機能します。
これは最も簡単な解決策のようですが、他の解決策と同じ問題があり、他のコードが壊れる可能性があります。
コンベンション?
Rust をある程度使用した後、すべての C++ STL コンテナーに対してこれを行うのは面倒だと感じました。これを行うと、同じ演算子がベクトルに対してオーバーロードされている場合など、他のコードが壊れる可能性があります。
Rust では、フォーマットしたい をテキストに追加するだけで、テキスト表現に自動的に変換できます。または、非正規表現が必要な場合は自分でトレイトを実装できます#[Debug]
。struct
そのDebug
実装を定義するのは、構造体の作成者の責任です。これが、Rust 標準ライブラリのすべてのコンテナが独自のDebug
実装を持っている理由です。
C++ に何らかの規則が存在するかどうか、または標準に対して同様の提案があるかどうかを尋ねています。私の場合のように、承認テストに役立つ可能性がありますが、ログやデバッグにも役立ちます (デバッガーはこのフォーマッターを使用して、ユーザーに変数値を表示できます)。