cin 是std::istream 的模型。对于任何 istream,stream >> x 的结果都是对 istream 本身的引用。
istream 包含一些标志来指示先前操作的成功或失败。
istream 也可以转换为bool。如果前面的操作成功,则布尔值将为 true,否则为 false(出于任何原因)。
因此,如果我们愿意,我们不仅可以链接 >> 操作,还可以链接其他检查。
这可能有点高级,但我想你会觉得它很有趣。
您可以按原样编译和运行该程序。
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
struct success_marker
{
success_marker(bool& b)
: _bool_to_mark(std::addressof(b))
{}
void mark(bool value) const {
*_bool_to_mark = value;
}
bool* _bool_to_mark;
};
std::istream& operator>>(std::istream& is, success_marker marker)
{
marker.mark(bool(is));
return is;
}
success_marker mark_success(bool& b) {
return success_marker(b);
}
void test(const std::string& test_name, std::istream& input)
{
bool have_a = false, have_b = false;
std::string a, b;
input >> std::quoted(a) >> mark_success(have_a) >> std::quoted(b) >> mark_success(have_b);
std::cout << test_name << std::endl;
std::cout << std::string(test_name.length(), '=') << std::endl;
std::cout << have_a << " : " << a << std::endl;
std::cout << have_b << " : " << b << std::endl;
std::cout << std::endl;
}
int main()
{
std::istringstream input("\"we have an a but no b\"");
test("just a", input);
// reset any error state so the stream can be re-used
// for another test
input.clear();
// put new data in the stream
input.str("\"the cat sat on\" \"the splendid mat\"");
// test again
test("both a and b", input);
return 0;
}
预期输出:
just a
======
1 : we have an a but no b
0 :
both a and b
============
1 : the cat sat on
1 : the splendid mat