Вы можете заменить streambuf cin другим, и в некоторых программах это проще, чем общая стратегия передачи istreams без прямой ссылки на cin.
int main(int argc, char* argv[]) {
ifstream input;
streambuf* orig_cin = 0;
if (argc >= 2) {
input.open(argv[1]);
if (!input) return 1;
orig_cin = cin.rdbuf(input.rdbuf());
cin.tie(0); // tied to cout by default
}
try {
// normal program using cin
}
catch (...) {
if (orig_cin) cin.rdbuf(orig_cin);
throw;
}
return 0;
}
Несмотря на то, что cin крайне редко используется после того, как управление покидает main, вышеупомянутый try-catch позволяет избежать неопределенного поведения, если ваша программа может это сделать.