Я хочу иметь средство ведения журнала, которое может создавать дочерние элементы. Каждый из них должен записать свое имя. Все они должны писать в один и тот же экземпляр LogImpl, который имеет интерфейс с функцией форматирования.
Важнейшим моментом является возможность создания дочерних элементов с вложенными именами.
Я написал что-то вроде этого (упрощенный пример):
Код: Выделить всё
#include
// Some third-party logger that I can't change
struct LogImpl {
std::function formatter{nullptr};
void write(const std::string &msg) const {
const auto fMsg = formatter ? formatter(msg) : msg;
std::cerr formatter = [&](const std::string &msg) {
return name + "\t" + msg + "\n";
};
}
};
int main() {
auto impl = new LogImpl();
Logger rootLogger{"root", impl};
auto childLogger = rootLogger.getChild("child");
rootLogger.setRichFormat();
rootLogger.write("ROOT MSG");
childLogger->write("CHILD MSG");
delete impl;
return 0;
}
Код: Выделить всё
root ROOT MSG
root CHILD MSG
Код: Выделить всё
root ROOT MSG
root.child CHILD MSG
Подробнее здесь: https://stackoverflow.com/questions/790 ... -on-object
Мобильная версия