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
は、なぜあなたは、あなたの質問のすべての単一の一つに「だから私は、次の問題を抱えている」と言うのですか?どのように質問に関連していますか? –