cin
是std::istream
的典範。對於任何istream,stream >> x
的結果是對istream
本身的引用。
istream
包含一些標誌來指示先前操作的成功或失敗。
istream
也可轉換爲bool
。如果之前的操作成功,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
你爲什麼說「所以我有下一個問題」在你的問題,每一個?這與任何問題有什麼關係? –