はじめに
C での関数のオーバーロードには、通常、パラメーターの型に基づいて関数を区別することが含まれます。 。ただし、戻り値に基づいて関数をオーバーロードすることも可能です。これにより、使用方法に応じてさまざまなタイプのデータを返す関数を定義できます。
問題ステートメント
次のタスクを考えてみましょう:
int n = mul(6, 3); // n = 18 std::string s = mul(6, 3); // s = "666"
ここでは、戻り値に応じて整数または文字列のいずれかを返す mul という名前の関数を定義する必要があります。
解決策
明示的な入力:
1 つのアプローチは、入力によって呼び出しを明示的に区別することです。たとえば、2 つの別々の関数を定義できます:
int mul(int, int); std::string mul(char, int);
そして次のように呼び出します:
int n = mul(6, 3); // n = 18 std::string s = mul('6', 3); // s = "666"
Dummy Pointer:
Anotherこの方法では、各関数にダミー パラメータを追加し、コンパイラに正しいパラメータを強制的に選択させます。例:
int mul(int *, int, int); std::string mul(std::string *, char, int);
これらを次のように使用します:
int n = mul((int *) NULL, 6, 3); // n = 18 std::string s = mul((std::string *) NULL, 54, 3); // s = "666"
戻り値のテンプレート化 (オプション 1):
を作成できます。インスタンス化してもコンパイルされないコードを含む「ダミー」関数。次に、必要な戻り値の型に特化したテンプレート バージョンを定義します。
template<typename T> T mul(int, int); template<> int mul<int>(int, int); template<> std::string mul<std::string>(int, int);
次のように使用します。
int n = mul<int>(6, 3); // n = 18 std::string s = mul<std::string>(54, 3); // s = "666"
戻り値のテンプレート化 (オプション 2):
パラメータが異なる場合は、個別のパラメータを使用して個別のテンプレートの特殊化を定義できます。タイプ:
template<typename T> T mul(int, int); template<> int mul<int>(int, int); template<typename T> T mul(char, int); template<> std::string mul<std::string>(char, int);
そしてそれらを次のように呼び出します:
int n = mul<int>(6, 3); // n = 18 std::string s = mul<std::string>('6', 3); // s = "666"
以上がC での関数のオーバーロードは戻り値に基づいて実現できますか? 実現できる場合はどのようにすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。