Можно ли сделать лямбду с областью динамического закрытия, в зависимости от объекта?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли сделать лямбду с областью динамического закрытия, в зависимости от объекта?

Сообщение Anonymous »

У меня есть идея создать что-то строковое средство ведения журнала Python, но на C++.
Я хочу иметь средство ведения журнала, которое может создавать дочерние элементы. Каждый из них должен записать свое имя. Все они должны писать в один и тот же экземпляр 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»