C++ 如何在没有运算符的情况下从stringstream返回下一个令牌>>;?
如何让C++ 如何在没有运算符的情况下从stringstream返回下一个令牌>>;?,c++,stringstream,C++,Stringstream,如何让std::stringstream返回下一个标记,而不是使用操作符>>将其提取到变量中 我在下面列举了一些我为什么要这样做的例子。我尝试了get(),但这只是返回下一个字符 #include <string> #include <sstream> std::string line("abc xyz"); std::stringstring ss(line); std::string token; ss >> token;
std::stringstream
返回下一个标记,而不是使用操作符>>
将其提取到变量中
我在下面列举了一些我为什么要这样做的例子。我尝试了get()
,但这只是返回下一个字符
#include <string>
#include <sstream>
std::string line("abc xyz");
std::stringstring ss(line);
std::string token;
ss >> token; // I don't want this
token = ss.next(); // I want something like this
if (ss.next() == "abc") // So I can do something like this
int x = std::stoi(ss.next()); // Or this
#包括
#包括
标准::字符串行(“abc xyz”);
标准::字符串ss(线);
字符串标记;
ss>>令牌;//我不要这个
token=ss.next();//我想要这样的东西
如果(ss.next()=“abc”)//那么我可以这样做
intx=std::stoi(ss.next());//还是这个
这样做的主要原因是在我不想存储或重用下一个令牌时生成更干净的代码。否则,代码将填充行ss>>令牌
编写函数
template<typename T = std::string>
T next(std::istream& is) {
T value;
if (is >> value)
return value;
else
throw an_exception_or_something;
}
然后,您可以决定如何在呼叫站点处理故障
int x = *next<int>(ss); // undefined behavior on error
int y = next<int>(ss).value(); // throws exception on error
int z = next<int>(ss).value_or(0); // return a default value on error
intx=*next(ss);//错误的未定义行为
int y=next(ss).value();//错误时引发异常
int z=next(ss).值_或(0);//错误时返回默认值
ss>>令牌;//我不想要这个
为什么?这有什么问题吗?使用ss.next()
可以使用ss>>token
实现所有使用ss.next()的操作。它可能会采取另一个步骤,但从长远来看,它可能会导致更干净的代码。@DimChtz我已经举例说明了为什么我不想在问题中使用它。@EastonBornemeier是的,我知道,但我在问这样的函数是否存在。许多标记化器提供了这样的功能。我不同意在您不想重用或存储token
的内容时,将代码与ss>>token
混在一起会使代码更干净。@johntery减少混乱是件好事。A有些人使用for()
循环如下:for(std::string item;ss>>item;){if(item==“abc”)/*do stuff*/;}
那么item
不会污染更广泛的范围。现在我明白了他想做什么,这看起来是一个很好的解决方案。
template<typename T = std::string>
std::optional<T> next(std::istream& is) {
T value;
if (is >> value)
return value;
else
return std::nullopt;
}
int x = *next<int>(ss); // undefined behavior on error
int y = next<int>(ss).value(); // throws exception on error
int z = next<int>(ss).value_or(0); // return a default value on error