4

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

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

4

1 に答える 1

3

コンテナを印刷するための規則や標準的な提案については知りません。ただし、{fmt} ライブラリは範囲とタプルのようなものを出力できます: https://fmt.dev/latest/api.html#ranges-and-tuple-formattingしたがって、おそらく ApprovalTests と統合して、ostream 挿入の定義を回避できます。オペレーター自身。

免責事項: 私は {fmt} の作成者です。

于 2020-04-22T15:24:35.240 に答える