2012-10-04 6 views
12

Unsere Logging-Framework, wie die meisten Logging Frameworks, verwendet das __FUNCTION__ Makro-Präprozessor die aktuelle Funktion in Log-Dateien einzufügen, so dass unsere Protokollierung wie folgt aussieht:Gibt es eine schöne Möglichkeit, Funktionsnamen innerhalb eines Lambda zu protokollieren?

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 

Wie wir ++ C 11 mehr verwenden, haben begonnen ich habe bemerkt, dass labmdas genau noch nicht hilfreich __FUNCTION__ Ausgabe erzeugen:

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 

Wie Sie bereits verloren sehen, hat alle Klassenbereich und alles, was wir jetzt wissen, dass diese Logging-Anweisung von einem anonymen Lambda kam. Hat jemand eine gute Strategie zum Abmelden der umschließenden Funktion? Dies scheint die nützlichste Sache zu sein, um zu loggen ...

+0

http://stackoverflow.com/questions/4434282/visual-c-äquivalent-von-file-line-and-pretty-function Was gibt '__FUNCSIG__' für lambdas? – BoBTFish

+0

Haha, VS2012 zeigt: 'wmain :: :: operator()' – Benj

+0

Zumindest zeigt es die umschließende Funktion ... – Benj

Antwort

9

Ich denke, die einzige Problemumgehung wäre, __FUNCTION__ (oder __func__ in C++ 11) in der umschließenden Funktion zu erweitern und das innerhalb des Lambda zu erfassen.

void f(){ 
    auto& _func_ = __func__; 
    [&]{ std::cout << _func_; }; 
} 

Ich würde dies als ein "Qualität der Umsetzung" Problem, obwohl. GCC zum Beispiel bietet die __PRETTY_FUNCTION__ Makro, das für lambda viel besser erweitert (und im Allgemeinen):

#include <iostream> 

struct X{ 
    void f(){ 
    []{ std::cout << __PRETTY_FUNCTION__ << "\n"; }(); 
    } 
}; 

int main(){ 
    X().f(); 
} 

Ausgang: X::f()::<lambda()>

Live example.

+4

+1 für '__PRETTY_FUNCTION__', wenn nur MSVC das implementiert hat. – Benj

Verwandte Themen