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";
}