問題タブ [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.

0 投票する
1 に答える
276 参照

c++ - 承認試験用STLコンテナの印刷に関する規約

優れたApprovalTests.cppライブラリを使用して承認テストを作成しています。このライブラリは、関数からの結果の「スナップショット」の生成を自動化します。スナップショットはTostream& operator<< (T val).

この演算子は常に、ある値をテキスト表現にフォーマットするための C++ 規則でした。プリミティブ型はこの演算子をサポートしており、カスタム型の独自の実装を作成できますが、 のような STL コンテナーの標準実装はありませんstd::vector

fmtや などの他のライブラリを使用しても、独自のものを実装できますpprint。同様の出力の例を次に示します。ApprovalTests.cpp で推奨されSTREAMいる具象型の代わりにジェネリック型をパラメーターとして使用していますが、考え方は変わりません。ostream

for ループ

ostream_iterator

fmt

https://github.com/fmtlib/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++ に何らかの規則が存在するかどうか、または標準に対して同様の提案があるかどうかを尋ねています。私の場合のように、承認テストに役立つ可能性がありますが、ログやデバッグにも役立ちます (デバッガーはこのフォーマッターを使用して、ユーザーに変数値を表示できます)。