Есть ли хороший способ регистрации имен функций, когда внутри лямбда?
Наша структура ведения журнала, как и большинство фреймворков регистрации, использует макрос препроцессора __FUNCTION__
для вставки текущей функции в файлы журнала, чтобы наш журнал выглядел следующим образом:
L4 T11332 609661594 [PreProcessorFunctions::RegenerateLinkIDs] [ENTER]
L4 T11332 609661594 [PreProcessorFunctions::RegenerateLinkIDs] [EXIT]
L4 T11332 609661594 [ConfigMerger::ValidateConfigObject] [ENTER]
L3 T11332 609661594 [ConfigMerger::ValidateConfigObject] Configuration Exists: 1
Как мы уже начали использовать С++ 11, я заметил, что labmdas производит точный, но бесполезный вывод __FUNCTION__
:
L4 T9604 609661594 [`anonymous-namespace'::<lambda1>::operator ()] Writing EMX config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\EMXConfiguration.xml
L4 T11332 609661594 [`anonymous-namespace'::<lambda3>::operator ()] Writing Auditing config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\Auditing.xml
L4 T11960 609661594 [`anonymous-namespace'::<lambda2>::operator ()] Writing UEM config file: C:\windows\TEMP\CBE01448-32A2-493A-A9A1-2112F5709028\CA37BE5C-B398-4D61-980D-66B8E1E6D001\\Configuration.xml
Как вы можете видеть, вся область класса потеряна, и все, что мы знаем сейчас, это то, что это выражение о регистрации произошло от анонимной лямбда. Кто-нибудь имеет хорошую стратегию для выхода из закрывающей функции? Это, казалось бы, самое полезное для регистрации...
Ответы
Ответ 1
Я думаю, что единственным обходным решением будет расширение __FUNCTION__
(или __func__
в С++ 11) в закрывающей функции и захват внутри лямбда.
void f(){
auto& _func_ = __func__;
[&]{ std::cout << _func_; };
}
Я бы отметил это как проблему "качества реализации". Например, GCC предоставляет макрос __PRETTY_FUNCTION__
, который значительно расширяется для лямбда (и вообще):
#include <iostream>
struct X{
void f(){
[]{ std::cout << __PRETTY_FUNCTION__ << "\n"; }();
}
};
int main(){
X().f();
}
Выход: X::f()::<lambda()>
Пример в реальном времени.