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

时间:2015-10-31 22:22:41

标签: 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 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()工作?

3 个答案:

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

享受!