使用するバージョンをコンパイラに指示する必要があります。C ++では、3つの方法で実行できます。
次のように入力して、呼び出しを明示的に区別します
charを待機している関数に整数を送信し、「6」のchar値が6ではなく54(ASCII)の場合に誤って数値6を送信したため、多少不正行為をしました。
std::string mul(char c, int n) { return std::string(n, c); }
std::string s = mul(6, 3); // s = "666"
もちろん、正しい解決策は、
std::string s = mul(static_cast<char>(54), 3); // s = "666"
あなたが解決策を望まなかったとしても、これは言及する価値があったと思います。
ダミーポインタで呼び出しを明示的に区別する
各関数にダミーパラメータを追加して、コンパイラに適切な関数を選択させることができます。最も簡単な方法は、戻りに必要なタイプのNULLダミーポインタを送信することです。
int mul(int *, int i, int j) { return i*j; }
std::string mul(std::string *, char c, int n) { return std::string(n, c); }
コードで使用できるもの:
int n = mul((int *) NULL, 6, 3); // n = 18
std::string s = mul((std::string *) NULL, 54, 3); // s = "666"
戻り値をテンプレート化することにより、呼び出しを明示的に区別します
このソリューションでは、インスタンス化された場合にコンパイルされないコードを使用して「ダミー」関数を作成します。
template<typename T>
T mul(int i, int j)
{
// If you get a compile error, it's because you did not use
// one of the authorized template specializations
const int k = 25 ; k = 36 ;
}
この関数はコンパイルされないことに注意してください。これは、テンプレートの特殊化によって一部の限定された関数のみを使用するため、良いことです。
template<>
int mul<int>(int i, int j)
{
return i * j ;
}
template<>
std::string mul<std::string>(int i, int j)
{
return std::string(j, static_cast<char>(i)) ;
}
したがって、次のコードがコンパイルされます。
int n = mul<int>(6, 3); // n = 18
std::string s = mul<std::string>(54, 3); // s = "666"
しかし、これはしません:
short n2 = mul<short>(6, 3); // error: assignment of read-only variable ‘k’
戻り値2をテンプレート化することにより、呼び出しを明示的に区別します。
ねえ、あなたもだましました!
そうです、2つの「オーバーロードされた」関数に同じパラメーターを使用しました。しかし、あなたは不正行為を始めました(上記を参照)...
^ _ ^
さらに深刻なことに、異なるパラメーターが必要な場合は、より多くのコードを記述し、あいまいさを避けるために関数を呼び出すときに適切な型を明示的に使用する必要があります。
// For "int, int" calls
template<typename T>
T mul(int i, int j)
{
// If you get a compile error, it's because you did not use
// one of the authorized template specializations
const int k = 25 ; k = 36 ;
}
template<>
int mul<int>(int i, int j)
{
return i * j ;
}
// For "char, int" calls
template<typename T>
T mul(char i, int j)
{
// If you get a compile error, it's because you did not use
// one of the authorized template specializations
const int k = 25 ; k = 36 ;
}
template<>
std::string mul<std::string>(char i, int j)
{
return std::string(j, (char) i) ;
}
そして、このコードはそのように使用されます:
int n = mul<int>(6, 3); // n = 18
std::string s = mul<std::string>('6', 3); // s = "666"
そして次の行:
short n2 = mul<short>(6, 3); // n = 18
それでもコンパイルされません。
結論
私はC++が大好きです...
:-p