На первый взгляд, самое простое решение - использовать троичный оператор ?:
, например:
istream_iterator<string> my_it( (argc == 2) ? ifstream(argv[1]) : cin );
Однако, это не совсем работает, потому что он создает временный объект ifstream
, который будет уничтожен в конце оператора. Таким образом, вам нужен способ условного создания ifstream
и его условного уничтожения после цикла for
. std::auto_ptr<>
соответствует требованиям. Таким образом:
auto_ptr<ifstream> file((argc == 2) ? new ifstream(argv[1]) : NULL);
istream_iterator<string> my_it( (argc == 2) : *file : cin);
for (; my_it != istream_iterator<string>(); my_it++)
printf("%s\n", (*my_it).c_str());
Другим, возможно, более чистым решением было бы перенести итерацию в отдельную функцию, которая принимает istream&
.
Я видел эту проблему до онлайн, о которой рассказал один из великих разработчиков C ++. К сожалению, я точно не помню, где и кем! Я думаю, что это было на DDJ, может быть, Саттер или Александреску?