#include <iostream>
#include <array>
#include <limits>
#include <iterator>
#include <algorithm>
template<typename T, typename Q, typename E>
T askForOne(std::ostream & out, std::istream & in, Q&& question, E&& error) {
T value;
out << question;
while (not (in >> value)) {
in.clear();
in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
out << error;
}
return value;
}
template<typename T, std::size_t N, typename Q, typename E>
std::array<T, N> askFor(std::ostream & out, std::istream & in, Q&& question, E&& error) {
std::array<T, N> values;
auto const scan = [&in, &values] {
for (auto & value : values) {
if (not (in >> value)) {
return false;
}
}
return true;
};
out << question;
while (not scan()) {
in.clear();
in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
out << error;
}
return values;
}
int main(int, char **) {
using namespace std;
int one = askForOne<int>(cout, cin, "Int? ", "Meh. ");
int two = askForOne<int>(cout, cin, "Int? ", "Meh. ");
auto ints = askFor<int, 5>(cout, cin, "5 ints? ", "Meh. ");
cout << "one = " << one << endl;
cout << "two = " << two << endl;
cout << "ints = ";
copy(begin(ints), end(ints), ostream_iterator<int>{cout, ", "});
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxsaW1pdHM+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFEsIHR5cGVuYW1lIEU+ClQgYXNrRm9yT25lKHN0ZDo6b3N0cmVhbSAmIG91dCwgc3RkOjppc3RyZWFtICYgaW4sIFEmJiBxdWVzdGlvbiwgRSYmIGVycm9yKSB7CiAgVCB2YWx1ZTsKICBvdXQgPDwgcXVlc3Rpb247CiAgd2hpbGUgKG5vdCAoaW4gPj4gdmFsdWUpKSB7CiAgICBpbi5jbGVhcigpOwogICAgaW4uaWdub3JlKHN0ZDo6bnVtZXJpY19saW1pdHM8c3RkOjpzdHJlYW1zaXplPjo6bWF4KCksICdcbicpOwogICAgb3V0IDw8IGVycm9yOwogIH0KICByZXR1cm4gdmFsdWU7Cn0KCgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCBzdGQ6OnNpemVfdCBOLCB0eXBlbmFtZSBRLCB0eXBlbmFtZSBFPgpzdGQ6OmFycmF5PFQsIE4+IGFza0ZvcihzdGQ6Om9zdHJlYW0gJiBvdXQsIHN0ZDo6aXN0cmVhbSAmIGluLCBRJiYgcXVlc3Rpb24sIEUmJiBlcnJvcikgewogIHN0ZDo6YXJyYXk8VCwgTj4gdmFsdWVzOwogIGF1dG8gY29uc3Qgc2NhbiA9IFsmaW4sICZ2YWx1ZXNdIHsKICAgIGZvciAoYXV0byAmIHZhbHVlIDogdmFsdWVzKSB7CiAgICAgIGlmIChub3QgKGluID4+IHZhbHVlKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfTsKICBvdXQgPDwgcXVlc3Rpb247CiAgd2hpbGUgKG5vdCBzY2FuKCkpIHsKICAgIGluLmNsZWFyKCk7CiAgICBpbi5pZ25vcmUoc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnN0cmVhbXNpemU+OjptYXgoKSwgJ1xuJyk7CiAgICBvdXQgPDwgZXJyb3I7CiAgfQogIHJldHVybiB2YWx1ZXM7Cn0KCgppbnQgbWFpbihpbnQsIGNoYXIgKiopIHsKICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogIGludCBvbmUgPSBhc2tGb3JPbmU8aW50Pihjb3V0LCBjaW4sICJJbnQ/ICIsICJNZWguICIpOwogIGludCB0d28gPSBhc2tGb3JPbmU8aW50Pihjb3V0LCBjaW4sICJJbnQ/ICIsICJNZWguICIpOwogIGF1dG8gaW50cyA9IGFza0ZvcjxpbnQsIDU+KGNvdXQsIGNpbiwgIjUgaW50cz8gIiwgIk1laC4gIik7CiAgY291dCA8PCAib25lID0gIiA8PCBvbmUgPDwgZW5kbDsKICBjb3V0IDw8ICJ0d28gPSAiIDw8IHR3byA8PCBlbmRsOwogIGNvdXQgPDwgImludHMgPSAiOwogIGNvcHkoYmVnaW4oaW50cyksIGVuZChpbnRzKSwgb3N0cmVhbV9pdGVyYXRvcjxpbnQ+e2NvdXQsICIsICJ9KTsKICByZXR1cm4gMDsKfQo=