在C++中,在调用我的函数根据程序的需要返回不同类型时,是否可以做一些时髦的东西?

Leo*_*rdo 1 c++ casting

考虑一下Zaita发布在cplusplus.com上的有用代码,特别是安全获取数字的部分,在我的情况下修改为一个函数:

int get_number()
{
   /**
    * cplusplus.com/forum/articles/6046
    * gets number from input stream
    **/

   string input = "";
   int number = 0;

   while (true)
   {
      getline(cin, input);
      stringstream checks(input);
      if (checks >> number)
         return number;
      cout << "Please enter a valid number\n";
   }
}
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是这样的:我可以删除intget_number()函数定义的第一行,并在我的代码顶部用我可能想要返回的所有类型声明它,例如做一些这样的声明:

double get_number();
int get_number();
long get_number();
unsigned short get_number();
...
...
Run Code Online (Sandbox Code Playgroud)

并以某种方式让它做不同的返回取决于我想要存储函数返回的变量?目前,我只是在将名称更改为时,编写基本相同功能的多个定义get_someType

我希望我可以用这种语法声明:

int get_number(int);
double get_double(double);
...
...
Run Code Online (Sandbox Code Playgroud)

我的愿望是做一些像:

int x;
x = get_number(int);
Run Code Online (Sandbox Code Playgroud)

我相信这不会起作用!因为用参数没有名字来定义函数的源代码是不可能的......

Ton*_*roy 6

首先,您发现的get_number实现编写得很糟糕:当您在输入上获得EOF时,您认为会发生什么?在您杀死程序之前,它会尽可能快地打印"请输入有效数字\n".

其次,你不能在返回类型上重载 - 这意味着你不能只有返回类型不同的函数.

最后,C++有模板可以做我想你想要的...

template <typename T>
bool get(T& x)
{
    std::string input;
    if (!getline(std::cin, input))
        return false;
    stringstream checks(input);
    if (checks >> x)
        return true;
    cout << "Please enter a valid value\n";
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用if (get(my_int)) ...if (get(my_double))等.

由于无法保证输入成功,因此您应该提供布尔返回类型(如图所示),或者在明确输入无法成功时抛出异常.