Наясно съм, че човек може да използва макроси на препроцесор, за да създаде функция, която приема „подобен на поток“ вход. За да изясня какво имам предвид под „подобен на поток“ вход, позволете ми да ви дам пример (входът към 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);
}
Това извежда:
Foo: Бар!: 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 и решенията за усилване също са разрешени.
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