Я знаю, что можно использовать макросы препроцессора для создания функции, которая принимает "потоковые" входные данные. Чтобы пояснить, что я имею в виду под «потоковым» вводом, позвольте мне привести пример (ввод в LOGGER является «потоковым»):
#include <iostream>
#include <sstream>
#define LOGGER(streamText) { \
std::ostringstream buffer; \
buffer << streamText; \
/* Some processing */ \
std::cout << buffer.str() << std::endl; \
}
int main(){
LOGGER("Foo: " << "Bar!: " << 42);
}
Это выводит:
Фу: Бар!: 42
Я хотел бы иметь аналогичный интерфейс для обычной функции C++. Примерно так (не компилируется, недопустимый код C++):
// has:
// - insert( std::ostringstream & str ) function for obtaining content of a std::ostringstream
// - formatting functions
// - print( std::ostream & str ) function
class logger_class;
logger_class logger_function( some_magic_type varName ){
std::ostringstream & str = varName;
logger_class log;
log.insert( str );
return log;
}
int main(){
logger_class log = logger_function("Foo: " << "Bar!: " << 42);
log.format( some_formatting_options );
log.print( std::cout );
}
Это позволит отформатировать вывод перед его фактической отправкой в std::cout.
Редактировать. Также разрешены решения C++11 и Boost.
logger_function("Foo" << 42).log_level( 500 ).color( RED ).weight( BOLD ).end_line();
- person elemakil   schedule 15.01.2014log() << "Foo" << 42 << log_level(500) << log_color(RED) << log_weight(BOLD) << endl;
? - person Useless   schedule 15.01.2014log() << log_level( 500 ) << log_color(RED) << log_weight(BOLD) << "Foo" << 42 << finish_color() << finish_weight() << std::endl;
, потому что для раскрашивания ANSI требуется последовательность начало раскрашивания и конец раскрашивания. - person elemakil   schedule 15.01.2014