![](/img/trans.png)
[英]How do I force this template to only accept an integer of a matching type?
[英]How do I accept 0 as an integer and not a bool value?
我正在尝试仅验证用户输入的整数。 我的代码工作正常,除非用户输入0。它不认为它是整数,并且认为值是false。 这是我如何编码此项目的简短示例。
int main ()
{
int num;
cout << "Please enter an integer: ";
cin >> num;
cout << endl;
while (! num)
{
cout << "That is not an integer.\n";
return;
}
}
如果用户输入0,即使0是整数,我也会进入while循环。
当且仅当num
为0时, 表达式 !num
为true
。因此,您的实现存在错误。
最简单的方法是使用类似
if (!(std::cin >> num)){
std::cout << "That is not an integer.\n";
}
如果您想自己验证输入,则可以考虑读取std::string
并检查是否可以将其转换为整数。 令人惊讶的是,这是不平凡的,因为int
可以取的可能值取决于平台(某些系统的范围小至-32767至+32767)。
如果可以,请使用boost::lexical_cast<int>(num);
我已经将num
升级为std::string
类型。 (您需要的头文件是<boost/lexical_cast.hpp>
)。
在c ++中,内置的int
类型没有像其他某些语言中那样具有任何可选的有效性:“ !num
”仅表示“ num==0
”而不是“ num
不存在”。
但是C ++ 17具有std::optional
模板,可以将您的vanilla int
变成您最初期望的样子!
您所需要的只是一些简单的模板魔术使其可与istream
:
template< class CharT, class Traits, class T >
basic_istream<CharT,Traits>& operator>>( basic_istream<CharT,Traits>&& st,
std::optional<T>& value )
{
T res;
st>>res;
value = (st)?res:{};
return st;
}
想到这一点,STL应该从盒子中提供这种过载。
现在,您所需int num
用std::optional<int> num
和voila替换int num
num-您的代码将按预期工作。
认真地说,只是使用Bathsheba的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.