你必须告诉编译器使用哪个版本。在 C++ 中,您可以通过三种方式进行操作。
通过键入明确区分呼叫
您有点作弊,因为您向等待字符的函数发送了一个整数,并且当 '6' 的字符值不是 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
嘿,你也作弊了!
对,我确实为两个“重载”函数使用了相同的参数。但你确实开始作弊(见上文)......
^_^
更严重的是,如果您需要不同的参数,那么您将编写更多代码,然后在调用函数时必须显式使用正确的类型以避免歧义:
// 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