Да.
Либо просто щелкните правой кнопкой мыши класс и выберите «Refactor-> Rename», или вставьте соответствующий package foo.bar
вверху и используйте Ctrl-1 для быстрого удаления.
Используйте ссылку. Обратите внимание, что ссылка должна иметь тип std::ostream
, не std::ofstream
, так как std::cout
std::ostream
, таким образом, необходимо использовать наименее общий знаменатель.
std::ofstream realOutFile;
if(outFileRequested)
realOutFile.open("foo.txt", std::ios::out);
std::ostream & outFile = (outFileRequested ? realOutFile : std::cout);
Я предполагаю, что Ваша программа ведет себя как стандартные инструменты Unix, что при отсутствии предоставления файл запишет в стандартный вывод, и при предоставлении файл запишет в тот файл. Можно перенаправить cout
для записи в другой потоковый буфер. Пока Ваше перенаправление живо, все записанное в суд прозрачно записано в место назначения, которое Вы назначили. После того как объект перенаправления выходит из объема, исходный поток помещается и производится, запишет в экран снова:
struct CoutRedirect {
std::streambuf * old;
CoutRedirect():old(0) {
// empty
}
~CoutRedirect() {
if(old != 0) {
std::cout.rdbuf(old);
}
}
void redirect(std::streambuf * to) {
old = std::cout.rdbuf(to);
}
}
int main() {
std::filebuf file;
CoutRedirect pipe;
if(outFileRequested) {
file.open("foo.txt", std::ios_base::out);
pipe.redirect(&file);
}
}
Теперь, суд перенаправляется в файл, пока канал жив в основном. Можно сделать это большим количеством "производства готовый" путем создания этого non-copyable, потому что это не готово быть скопированным: Если бы копия выходит из объема, она уже восстановила бы исходный поток.
Можно найти очень подробное объяснение того, как сделать это здесь: http://groups.google.com/group/comp.lang.c++/msg/1d941c0f26ea0d81?pli=1
, Надо надеяться, кто-то опишет это более ясно, чтобы переполнение стека взяло точки...
Следующий Adam Rosenfield дорожки, но решение ссылочной проблемы инициализации с тернарными операторами и операторами запятой:
bool outFileRequested = false;
std::ofstream realOutFile;
std::ostream & outFile = outFileRequested
? realOutFile.open("foo.txt", std::ios::out), realOutFile
: std::cout;
outFile << "some witty remark";
(Протестированный в VS)
Я не уверен, что можно присвоить суд переменной типа ofstream., суд является объектом типа ostream (тогда как cin имеет тип istream), и я не уверен, что каждый наследовался другому. Так, возможно, что-то проверяющее, чтобы видеть, давался ли файл/существовался и создание соответствующего потокового типа, было бы лучшим подходом.
Я думаю Adam на правильном пути, но я не думаю, что можно присвоить ссылки - необходимо использовать указатель вместо этого:
std::ofstream realOutFile;
std::ostream * poutFile;
if(outFileRequested)
{
realOutFile.open("foo.txt", std::ios::out);
poutFile = &realOutFile;
}
else
poutFile = &std::cout;
Вы могли затем определить ссылку, чтобы быть значением указателя, но это не будет глобально
std::ostream & outFile = *poutFile;