web-dev-qa-db-ja.com

戻り型によるオーバーロード

ここでSOについてのいくつかの質問を読みましたが、これはまだ私を混乱させているようです。

オーバーロードする簡単な方法があります

class My {
public:
    int get(int);
    char get(int);
}

テンプレートや奇妙な動作なし?または私はちょうどする必要があります

class My {
public:
    int get_int(int);
    char get_char(int);
}

67
Shoe

いいえ、ありません。戻り値の型に基づいてメソッドをオーバーロードすることはできません。

オーバーロードの解決では、関数シグネチャが考慮されます。関数シグネチャは次のもので構成されます。

  • 関数名
  • cv-修飾子
  • パラメータタイプ

そして、ここに引用があります:

1.3.11署名

オーバーロード解決に関与する関数に関する情報(13.3):そのparameter-type-list(8.3.5)、および関数がクラスメンバーの場合、関数自体とクラスのcv修飾子(存在する場合)メンバー関数が宣言されています。 [...]

オプション:

1)メソッド名を変更します:

class My {
public:
    int getInt(int);
    char getChar(int);
};

2)出力パラメーター:

class My {
public:
    void get(int, int&);
    void get(int, char&);
}

3)テンプレート...この場合はやり過ぎ。

90
Luchian Grigore

それは可能ですが、初心者に勧めるテクニックであるかどうかはわかりません。他の場合と同様に、戻り値の使用方法に応じて関数を選択する場合は、プロキシを使用します。最初にgetChargetIntなどの関数を定義してから、次のようなProxyを返す汎用get()を定義します。

class Proxy
{
    My const* myOwner;
public:
    Proxy( My const* owner ) : myOwner( owner ) {}
    operator int() const
    {
        return myOwner->getInt();
    }
    operator char() const
    {
        return myOwner->getChar();
    }
};

必要な数の型に拡張します。

74
James Kanze

いいえ、戻り値の型でオーバーロードすることはできません。パラメータタイプ、およびconst/volatile修飾子のみ。

1つの選択肢は、参照引数を使用して「戻る」ことです。

void get(int, int&);
void get(int, char&);

ただし、テンプレートを使用するか、2番目の例のような異なる名前の関数を使用します。

8
Mike Seymour

あなたはこのように考えることができます:

あなたが持っている:

  int get(int);
  char get(int);

また、呼び出し中に関数の戻り値を収集することは必須ではありません。

今、あなたは呼び出す

  get(10);  -> there is an ambiguity here which function to invoke. 

したがって、戻り値の型に基づいてオーバーロードが許可されている場合は意味がありません。

4
Whoami

C++の戻り値型によってオーバーロードする方法はありません。テンプレートを使用せずに、get_intおよびget_charはあなたができる最善の方法です。

2
sepp2k

戻り値の型に基づいてメソッドをオーバーロードすることはできません。最善の策は、2番目のコードスニペットのように、わずかに異なる構文で2つの関数を作成することです。

2
Frecklefoot

この問題に関する他のコメントのほとんどは技術的には正しいものですが、効果的に戻り値をオーバーロードすることができますifオーバーロードする入力パラメーターと組み合わせることができます。例えば:

class My {
public:
    int  get(int);
    char get(unsigned int);
};

デモ:

#include <stdio.h>

class My {
public:
    int  get(         int x) { return 'I';  };
    char get(unsinged int x) { return 'C';  };
};

int main() {

    int i;
    My test;

    printf( "%c\n", test.get(               i) );
    printf( "%c\n", test.get((unsigned int) i) );
}

この結果は次のとおりです。

I 
C
2
codechimp

関数の戻り値の型に基づいて関数をオーバーロードすることはできません。この関数がとる引数のタイプと数に基づいてオーバーリードできます。

0
AlexDan