Мне известно, что для создания функции, принимающей входной поток, можно использовать макросы препроцессора. Для того, чтобы выяснить, что я имею в виду под «потоковый как» вход, позвольте мне дать вам пример (вход в LOGGER является «поток типа»):Использование «Stream-like» Input для функции C++
#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: Bar !: 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);
}
, который позволил бы формат вывода до фактического отправки его станд :: соиЬ.
Редактировать: C + + 11 и надменные решения также допускаются.
Вы ищете перегруженные версии << - (? Замена станд :: вне или станд :: заблуждаться по имени регистратор) оператора – urzeit
@urzeit Sort-оф. Я хочу, чтобы регистратор мог предположить, что введенный им вход был полным сообщением. Позвольте мне привести пример: один вариант форматирования - это раскраска, которая (при условии, что терминал ANSI) состоит из включения содержимого двумя разделителями. С помощью макро-решения это можно сделать легко, добавив разделители до и после потоковой передачи сообщения журнала в выходной поток (поскольку все сообщение журнала содержится в аргументе макроса). – elemakil
Я хочу, чтобы функция возвращала объект журнала, потому что это позволяет установить параметры форматирования с помощью цепочки методов, то есть: 'logger_function (« Foo »<< 42) .log_level (500) .color (RED) .weight (BOLD) .end_line(); ' – elemakil