C++ 具有不同返回类型的函数重载
我知道我们不允许只基于返回类型重载函数。假设我有两个函数C++ 具有不同返回类型的函数重载,c++,function,c++11,overloading,C++,Function,C++11,Overloading,我知道我们不允许只基于返回类型重载函数。假设我有两个函数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
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;
}
虽然我重载了只在返回类型上不同的函数,但当我根据返回类型将它们分配给数据类型时,我不应该在双d1
和int i1
中获得转换后的字符串num
现在我得到的错误类似于:
错误:新声明“int convert(std::string)”|错误:歧义
旧声明“双重转换(标准::字符串)”|
如果我希望通过重载函数使
convert()
具有不同的返回类型,我将如何使它工作?一种方法是将所需的返回类型作为输出变量传递。这样,您的代码将变成:
void convert(string num, double *d_num){
stringstream ss;
ss<<num;
ss>>*d_num;
}
void convert(string num, int *i_num){
/*.....
same as previous
.....
*/
}
void转换(字符串数,双*d_数){
细流ss;
ss*d_num;
}
无效转换(字符串数,int*i_数){
/*.....
同上
.....
*/
}
由于函数的参数签名不同,因此重载是可以的
如果我希望通过重载函数使convert()具有不同的返回类型,我将如何使convert()工作
您可以创建一个简单的函数模板
template <typename T>
T convert(std::string const& num){
std::istringstream ss(num);
T d_num;
ss>>d_num;
return d_num;
}
并将其用作:
auto d1 = convert<double>(st);
auto i1 = convert<int>(st);
auto d1=转换(st);
自动i1=转换(st);
> > 不能基于C和C++中的返回类型进行重载,但可以通过返回类和提供转换运算符来欺骗。(不要忘记插入运算符。)注意:
#包括
#包括
结构纤维
{
无符号长值;
fib(无符号n)
{
值=!!n;
如果(!n)返回;
无符号长周期上一个=0;
而(--n)
{
长下一个=值+上一个;
prev=值;
值=下一个;
}
}
运算符long()常量{返回值;}
运算符std::string()常量{return std::to_string(value);}
};
std::ostream&操作符只需重命名它。将转换为int(std::string)
和转换为浮点数(std::string)
FYI STL已经为这些转换提供了函数,即,当目标类型为字符串时,专门化模板以返回字符串!唯一剩下的建议-通过const引用传递,在特殊情况下也可能通过它返回(有争议)。@NeilKirk,如果函数模板的返回类型为T
,则返回类型必须保持std::string
。否则,它就不会算作专门化。酷,我不知道。任何附加信息或指向模板的链接都会有帮助。这将是一个有效的重载,因为函数在参数类型上有所不同,但我希望函数只在返回类型上有所不同
template <>
std::string convert<std::string>(std::string const& in){
return in;
}
auto d1 = convert<double>(st);
auto i1 = convert<int>(st);
#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";
}