考虑一下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)
我相信这不会起作用!因为用参数没有名字来定义函数的源代码是不可能的......
首先,您发现的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))等.
由于无法保证输入成功,因此您应该提供布尔返回类型(如图所示),或者在明确输入无法成功时抛出异常.
| 归档时间: |
|
| 查看次数: |
144 次 |
| 最近记录: |