2017-08-10 22 views
-2

你如何得到一个std::stringstream返回下一个标记,而不是将它解压缩成一个变量operator>>如何在没有操作符>>的情况下从串流返回下一个标记?

我已经包含了一些为什么我想在下面做这个的例子。我试过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 

这样做的主要原因是当我不想存储或重用下一个标记时产生更清晰的代码。否则,代码将填充行ss >> token

+1

'ss >> token; //我不想要这个'为什么?这有什么问题? – DimChtz

+2

用ss.next()做的所有事情都可以用ss >> token来实现。这可能需要另一步,但从长远来看,这可能会导致更干净的代码。 –

+0

@DimChtz我举了一些例子,说明为什么我不想在问题中使用它。 –

回答

3

写一个函数。另外

if (next<>(ss) == "abc") 
    do_something(); 
int x = next<int>(ss); // note: no need for stoi 

,返回std::optional,如果您的实现支持它:

template<typename T = std::string> 
T next(std::istream& is) { 
    T value; 
    if (is >> value) 
     return value; 
    else 
     throw an_exception_or_something; 
} 

然后你就可以做到这一点。

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 
+0

现在,我明白他想要做什么,这看起来像一个不错的解决方案。 – Barmar

相关问题