Подтвердить что ты не робот

Есть ли хороший способ регистрации имен функций, когда внутри лямбда?

Наша структура ведения журнала, как и большинство фреймворков регистрации, использует макрос препроцессора __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

Как вы можете видеть, вся область класса потеряна, и все, что мы знаем сейчас, это то, что это выражение о регистрации произошло от анонимной лямбда. Кто-нибудь имеет хорошую стратегию для выхода из закрывающей функции? Это, казалось бы, самое полезное для регистрации...

4b9b3361

Ответ 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()>

Пример в реальном времени.