2017-01-26 3 views
-2

Как я могу сделать этот псевдокод?Как «параметризовать» выходной поток?

std::ostream ostr; 
std::ofstream ofstr; 

if(condition) { 
    ostr = std::cout; 
} 
else { 
    ofstr.open("file.txt"); 
    ostr = ofstr; 
} 

ostr << "Hello" << std::endl; 

Это не компилируется, так как std::ostream не имеет конструктор по умолчанию.

+0

Связанный вопрос не является _exact_ дубликат, но это достаточно близко, и принятый ответ показывает решение вашей проблемы. – Useless

+1

В вашем случае вы можете использовать тернарный оператор: 'std :: ostream & ostr = (условие? Std :: cout: (ofstr.open (" file.txt "), ofstr));' – Jarod42

+0

@ Jarod42: просто попробовал; он работает, когда 'condition' истинно, и я получаю вывод на cout, но я не получаю никакого файла, записанного, когда' condition' является ложным. – Pietro

ответ

1

В вашем случае вы можете использовать тройной оператор:

std::ostream& ostr = (condition ? 
         std::cout : 
         (ofstr.open("file.txt"), ofstr)); // Comma operator also used 
                 // To allow fstream initialization. 
0

Эта реализация может переключиться на другие потоки:

std::ofstream ofstr; 
std::ostream *ostr; 

ofstr.open("file.txt"); 

ostr = &ofstr; 
*ostr << "test --> file\n" << std::endl; 

ostr = &std::cout; 
*ostr << "test --> stdout\n" << std::endl; 
Смежные вопросы