APIを作成していますが、strip
の関数をオーバーロードしたいと思います。
QString MyClass::strip();
QString MyClass::strip(QRegularExpression open);
QString MyClass::strip(QRegularExpression close);
QString MyClass::strip(QRegularExpression open, QRegularExpression close);
明らかに、2番目と3番目の競合です。
C++およびQtプログラマーがこれを再構築するために推奨されるスタイルは何ですか?
引数を保持するクラスを作成するのはどうですか?このクラスには、open
とclose
の両方のパラメーターが含まれ、どちらかがNULL
になる可能性があります。次に、上記のクラスを引数として持つstrip
メソッドが1つだけ存在し、open
/close
が設定されている場合、それを使用するかどうかをメソッドが決定します。
多くのオプションがあり、それはあなたが取るあなたのトレードオフです:
デフォルトのbool
引数を追加します。
QString MyClass::strip(QRegularExpression regex, bool close=false);
// Mimic the two-regex-variants interface as good as possible
より説明的な1のバリアントとして、スコープ付き列挙型とデフォルトなしを使用します。
enum class option { open, close };
QString MyClass::strip(QRegularExpression regex, option open_close);
std::experimental::optional
またはそのようなもの、多分 from boost を使用します。
特定の正規表現が何もしないことを確認し、それを何もしないデフォルトとして文書化します。
オーバーロードを使用して、1つの引数をstd::nullptr_t
で置き換えます。
QString MyClass::strip(std::nullptr_t open, QRegularExpression close);
QString MyClass::strip(QRegularExpression open, std::nullptr_t close = {});
タグを使用してオーバーヘッドを回避します。
constexpr struct open_t {} open;
constexpr struct close_t {} close;
QString MyClass::strip(open_t, QRegularExpression regex);
QString MyClass::strip(close_t, QRegularExpression regex);
// Call it like this:
object.strip(object.open, regex);
箇条書きをかじり、それらの関数に異なる名前を付けます:
QString MyClass::strip_open(QRegularExpression regex);
QString MyClass::strip_close(QRegularExpression regex);
Open-regexとclose-regexを異なるタイプにすることが理にかなっているかどうかを検討します。正直に言うと、ここでは疑いますが、適切な場合はそれが最良の選択肢です。
提案する
QString MyClass::strip();
QString MyClass::strip(QRegularExpression regex, bool opening=false);
QString MyClass::strip(QRegularExpression open, QRegularExpression close);
そしておそらく
QString MyClass::strip_open(QRegularExpression regex);
QString MyClass::strip_close(QRegularExpression regex);
またはbool opening
例:.
enum stripping_mode {Strip_Open, Strip_Close};;
またはそれをclass enum