在 if 语句中使用字符串流>>运算符

using stringstream >> operator in if statement

本文关键字:gt 运算符 字符串 if 语句      更新时间:2023-10-16

以下代码片段旨在尝试使用字符串流对象从字符串中提取整数,并检测整数提取是否成功。stringstream类继承>>运算符以返回对istream实例的引用。整数提取失败如何导致myStream等于0,而其str成员仍然是strInput?

stringstream myStream(strInput);
if (myStream >> num){//successfull integer extraction}
else{//unsuccessfull integer extraction
cout<<myStream<<endl;
cout<<myStream.str().c_str()<<endl;}

stream有一个operator bool()operator void*(),它返回(类似于)!fail()-或者在void *失败时返回NULL。所以,如果流没有失败,那也没关系。operator >>返回对stream对象的引用,所以编译器说"嗯,不能将流对象与真值进行比较,让我们看看我们是否可以从中生成boolvoid *,是的,我们可以,所以让我们使用它

答案在将std::ios转换为void*的运算符中(在C++11中替换为将basic_ios转换为bool的运算符):

从ios派生的流对象可以被投射到指针。如果设置了其中一个错误标志(故障位或坏位),则此指针为空指针,否则为非零指针。

当流在ifwhilefor条件中使用时,会调用此运算符。对于需要编写的情况,还有一个一元!运算符

if (!(myStream >> num)) {
    ...
}