優れたApprovalTests.cppライブラリを使用して承認テストを作成しています。このライブラリは、関数からの結果の「スナップショット」の生成を自動化します。スナップショットはT
、ostream& operator<< (T val)
.
この演算子は常に、ある値をテキスト表現にフォーマットするための C++ 規則でした。プリミティブ型はこの演算子をサポートしており、カスタム型の独自の実装を作成できますが、 のような STL コンテナーの標準実装はありませんstd::vector
。
fmt
や などの他のライブラリを使用しても、独自のものを実装できますpprint
。同様の出力の例を次に示します。ApprovalTests.cpp で推奨されてSTREAM
いる具象型の代わりにジェネリック型をパラメーターとして使用していますが、考え方は変わりません。ostream
for ループ
template <typename STREAM, typename T> STREAM& operator<<(STREAM& os, const std::vector<T>& vec) {
os << "[";
for (const auto& x : vec) {
os << x << ", ";
}
os << "]";
return os;
}
ostream_iterator
template <typename T> std::ostream& operator<<(std::ostream& os, const std::vector<T>& v) {
using namespace std;
os << "[";
copy(v.begin(), v.end(), ostream_iterator<T>(os, ", "));
os << "]";
return os;
}
fmt
template <typename STREAM, typename T> STREAM& operator<<(STREAM& os, const std::vector<T>& vec) {
fmt::print(os, "[{}]", fmt::join(vec, ", "));
return os;
}
ヘッダー<fmt/ranges.h
付き:
template <typename STREAM, typename T> STREAM& operator<<(STREAM& os, const std::vector<T>& vec) {
fmt::print(os, "{}", vec);
return os;
}
プリティプリント
https://github.com/p-ranav/pprint
template <typename STREAM, typename T> STREAM& operator<<(STREAM& os, const std::vector<T>& vec) {
pprint::PrettyPrinter printer{os};
printer.print(vec);
return os;
}
cxx-prettyprint
prettyprint.hppをインクルードするだけで、STL コンテナーで機能します。
これは最も簡単な解決策のようですが、他の解決策と同じ問題があり、他のコードが壊れる可能性があります。
コンベンション?
Rust をある程度使用した後、すべての C++ STL コンテナーに対してこれを行うのは面倒だと感じました。これを行うと、同じ演算子がベクトルに対してオーバーロードされている場合など、他のコードが壊れる可能性があります。
Rust では、フォーマットしたい をテキストに追加するだけで、テキスト表現に自動的に変換できます。または、非正規表現が必要な場合は自分でトレイトを実装できます#[Debug]
。struct
そのDebug
実装を定義するのは、構造体の作成者の責任です。これが、Rust 標準ライブラリのすべてのコンテナが独自のDebug
実装を持っている理由です。
C++ に何らかの規則が存在するかどうか、または標準に対して同様の提案があるかどうかを尋ねています。私の場合のように、承認テストに役立つ可能性がありますが、ログやデバッグにも役立ちます (デバッガーはこのフォーマッターを使用して、ユーザーに変数値を表示できます)。