我正在编写这个函数来请求特定的输入类型。is_type 仅验证接收到的字符串是否可以使用 stringstream 转换为所需的类型。
template<typename T>
T get_type(std::string prompt)
{
T output;
std::cout << prompt;
std::string Input;
while (std::getline(std::cin, Input) && !is_type<T>(Input))
{
std::cout << "Invalid input type. Please try again:\n"
<< prompt;
}
std::stringstream(Input) >> output;
return output;
}
这个函数看起来在正常情况下都能按照预期工作,但是当我输入ctrl + Z时出现了问题。应该如何处理这种情况呢?
我添加了:
template<typename T>
T get_type(std::string prompt)
{
T output;
std::cout << prompt;
std::string Input;
while (std::getline(std::cin, Input) && !is_type<T>(Input))
{
std::cout << "Invalid input type. Please try again:\n"
<< prompt;
}
if (!std::cin)
{
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
output = get_type<std::string>(prompt) ;
return output;
}
std::stringstream(Input) >> output;
return output;
}
当使用例如ctrl+Z的键盘输入后,需要再次请求输入。那么这样解决了std::getline(std::cin, std::string)在用户键盘输入下失败的问题吗?
另外,为什么我必须按两次回车键才能完成
output = get_type<std::string>(prompt) ;
运行在 if 语句内部的代码行。
is_type
看起来是多余的,因为您可以在循环中检查stringstream::operator>>
的结果,而不是在循环结束后进行检查。 - Remy Lebeau