你如何获得一个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
这样做的主要原因是当我不想存储或重用下一个令牌时生成更清晰的代码。否则,代码将填充 lines ss >> token
。
写一个函数。
template<typename T = std::string>
T next(std::istream& is) {
T value;
if (is >> value)
return value;
else
throw an_exception_or_something;
}
然后你可以这样做:
if (next<>(ss) == "abc")
do_something();
int x = next<int>(ss); // note: no need for stoi
或者,返回 a std::optional
,如果您的实现支持它。
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句