你如何 return 没有运算符>>的字符串流中的下一个标记?
How do you return the next token from a stringstream without operator>>?
如何获得 std::stringstream
到 return 下一个标记,而不是将其提取到带有 operator>>
的变量中?
我在下面包含了一些我想要这样做的例子。我试过 get()
,但这只是 return 的下一个字符。
#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
.
行
写一个函数。
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
或者,return 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
如何获得 std::stringstream
到 return 下一个标记,而不是将其提取到带有 operator>>
的变量中?
我在下面包含了一些我想要这样做的例子。我试过 get()
,但这只是 return 的下一个字符。
#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
.
写一个函数。
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
或者,return 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