2012-10-04 8 views
12

Nuestro marco de registro, como la mayoría de los marcos de registro, utiliza la macro __FUNCTION__ preprocesador para insertar la función actual en los archivos de registro para que nuestro registro se parece a:¿Hay alguna buena forma de registrar nombres de funciones cuando se encuentra dentro de una lambda?

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 

Como hemos empezado a utilizar C++ 11 más , me he dado cuenta de que labmdas producen precisa sin embargo inútil __FUNCTION__ de salida:

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 

Como se puede ver, todo ámbito de la clase se ha perdido y todo lo que ahora sabemos es que esta declaración de registro vino de una lambda en el anonimato. ¿Alguien tiene una buena estrategia para cerrar la función adjunta? Esto parece ser lo más útil para iniciar sesión ...

+0

http://stackoverflow.com/questions/4434282/visual-c-equivalent-of-file-line-and-pretty-function ¿Qué significa '__FUNCSIG__' para lambdas? – BoBTFish

+0

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

+0

Al menos muestra la función adjunta ... – Benj

Respuesta

9

Creo que la única solución sería ampliar __FUNCTION__ (o __func__ en C++ 11) en la función adjunta y capturar eso dentro de la lambda.

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

Sin embargo, etiquetaría esto como un problema de "calidad de implementación". GCC, por ejemplo, proporciona la macro __PRETTY_FUNCTION__ que se expande mucho mejor para lambdas (y en general):

#include <iostream> 

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

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

de salida: X::f()::<lambda()>

Live example.

+4

+1 para '__PRETTY_FUNCTION__', si solo MSVC lo implementó. – Benj

Cuestiones relacionadas