具有不同返回类型的函数重载

Function overloading with different return types

本文关键字:函数 重载 返回类型      更新时间:2023-10-16

我知道我们不允许仅基于返回类型重载函数。假设我有两个函数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);
}

虽然我重载了只在返回类型上不同的函数,但当我根据它们的返回类型将它们分配给数据类型时,我不应该在double d1int i1中获得转换后的string num吗?

现在我得到类似的错误:

错误:新声明"int convert(std::string)"|错误:歧义旧声明"double convert(std::string)"|

如果我想通过重载函数使convert()具有不同的返回类型,我将如何使其工作?

如果我想通过重载函数使convert()具有不同的返回类型,我将如何使其工作?

您可以创建一个简单的函数模板。

template <typename T>
T convert(std::string const& num){
    std::istringstream ss(num);
    T d_num;
    ss>>d_num;
    return d_num;
}

并将其专门化为CCD_ 7,以便输入参数用于复制构造返回的CCD_。

template <>
std::string convert<std::string>(std::string const& in){
    return in;
}

并将其用作:

auto d1 = convert<double>(st);
auto i1 = convert<int>(st);

一种方法是将所需的返回类型作为输出变量传递。这样,你的代码就会变成:

void convert(string num, double *d_num){
    stringstream ss;
    ss<<num;
    ss>>*d_num;
}
void convert(string num, int *i_num){
    /*.....
   same as previous
   .....
   */
}

由于函数的参数签名不同,因此重载是可以的。

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

享受吧!