Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在没有运算符的情况下从stringstream返回下一个令牌>>;?_C++_Stringstream - Fatal编程技术网

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