ホームページ >バックエンド開発 >C++ >C での関数のオーバーロードは戻り値に基づいて実現できますか? 実現できる場合はどのようにすればよいですか?

C での関数のオーバーロードは戻り値に基づいて実現できますか? 実現できる場合はどのようにすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-28 21:59:12755ブラウズ

Can Function Overloading in C   Be Achieved Based on Return Value, and if so, How?

戻り値による関数のオーバーロードのオーバーライド

はじめに

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。