我知道我们不允许仅基于返回类型重载函数。假设我有两个函数double convert(string num)
和int convert(string num)
请考虑以下示例代码:
double convert(string num){
stringstream ss;
double d_num;
ss<<num;
ss>>d_num;
return d_num;
}
int convert(string num){
int i_num;
/*.....
same as previous
.....
*/
return i_num;
}
在main()中:
int main(){
string st="09122321";
double d1=convert(st);
int i1=convert(st);
}
虽然我重载的功能仅在返回类型上有所不同,但是当我根据返回类型将它们分配给数据类型时,我不应该在string num
中获得转换后的double d1
int i1
?
现在我收到的错误类似于:
错误:新声明&#39; int convert(std :: string)&#39; |错误:模棱两可 旧声明&#39;双转换(std :: string)&#39; |
如果我希望通过重载函数让它具有不同的返回类型,我将如何使convert()
工作?
答案 0 :(得分:6)
如果我希望它通过重载函数让它具有不同的返回类型,我将如何使convert()工作?
您可以创建一个简单的功能模板。
template <typename T>
T convert(std::string const& num){
std::istringstream ss(num);
T d_num;
ss>>d_num;
return d_num;
}
并将其专门用于std::string
,以便输入参数用于复制构造返回的std::string
。
template <>
std::string convert<std::string>(std::string const& in){
return in;
}
并将其用作:
auto d1 = convert<double>(st);
auto i1 = convert<int>(st);
答案 1 :(得分:2)
一种方法是将所需的返回类型作为输出变量传递。有了这个,您的代码将成为:
void convert(string num, double *d_num){
stringstream ss;
ss<<num;
ss>>*d_num;
}
void convert(string num, int *i_num){
/*.....
same as previous
.....
*/
}
由于函数的参数签名不同,因此过载很好。
答案 2 :(得分:0)
您不能基于C和C ++中的返回类型重载,但您可以通过返回类并提供转换运算符来作弊。 (不要忘记插入操作员。)看哪:
#include <iostream>
#include <string>
struct fib
{
unsigned long value;
fib( unsigned n )
{
value = !!n;
if (!n) return;
unsigned long prev = 0;
while (--n)
{
long next = value + prev;
prev = value;
value = next;
}
}
operator long () const { return value; }
operator std::string () const { return std::to_string( value ); }
};
std::ostream& operator << ( std::ostream& outs, const fib& f )
{
return outs << (std::string)f;
}
void print( double x )
{
std::cout << "fib 3 = " << x << "\n";
}
int main()
{
long x = fib( 5 );
std::string s = fib( 7 );
print( fib( 3 ) );
std::cout << "fib 5 = " << x << "\n";
std::cout << "fib 7 = " << s << "\n";
std::cout << "fib 9 = " << fib( 9 ) << "\n";
}
享受!