web-dev-qa-db-ja.com

同じ型パラメーターで関数をオーバーロードしたい。私は何をすべきか?

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プログラマーがこれを再構築するために推奨されるスタイルは何ですか?

4
Akiva

引数を保持するクラスを作成するのはどうですか?このクラスには、opencloseの両方のパラメーターが含まれ、どちらかがNULLになる可能性があります。次に、上記のクラスを引数として持つstripメソッドが1つだけ存在し、open/closeが設定されている場合、それを使用するかどうかをメソッドが決定します。

6
Euphoric

多くのオプションがあり、それはあなたが取るあなたのトレードオフです:

実行時の決定:

  1. デフォルトのbool引数を追加します。

    QString MyClass::strip(QRegularExpression regex, bool close=false);
    // Mimic the two-regex-variants interface as good as possible
    
  2. より説明的な1のバリアントとして、スコープ付き列挙型とデフォルトなしを使用します。

    enum class option { open, close };
    QString MyClass::strip(QRegularExpression regex, option open_close);
    
  3. std::experimental::optional またはそのようなもの、多分 from boost を使用します。

  4. 特定の正規表現が何もしないことを確認し、それを何もしないデフォルトとして文書化します。

コンパイル時の決定:

  1. オーバーロードを使用して、1つの引数をstd::nullptr_tで置き換えます。

    QString MyClass::strip(std::nullptr_t open, QRegularExpression close);
    QString MyClass::strip(QRegularExpression open, std::nullptr_t close = {});
    
  2. タグを使用してオーバーヘッドを回避します。

    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);
    
  3. 箇条書きをかじり、それらの関数に異なる名前を付けます:

    QString MyClass::strip_open(QRegularExpression regex);
    QString MyClass::strip_close(QRegularExpression regex);
    
  4. Open-regexとclose-regexを異なるタイプにすることが理にかなっているかどうかを検討します。正直に言うと、ここでは疑いますが、適切な場合はそれが最良の選択肢です。

5
Deduplicator

提案する

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