2010-05-13 12 views
10

Considere el siguiente fragmento de código C++ 0x:El uso correcto de impulso lambda

a_signal.connect([](int i) { 
    if(boost::any_cast<std::string>(_buffer[i]) == "foo") 
    { 
    base_class<>* an_object = new derived_class(); 
    an_object->a_method(_buffer[i]); 
    }}); 

¿Cómo se mira correctamente en Boost Lambda (ya que esta característica C++ 0x no se puede utilizar en GCC 4.4 todavía)?

+0

Usted puede * * utilizar C++ 0x función de si el compilador lo soporta. – kennytm

+2

¡Dios mío, el dolor! ¡Hazlo parar! (Buena pregunta, sin embargo). –

+0

@KennyTM Tengo GCC 4.4 y aún no lo admite. GCC 4.5 lo admite (afaik) pero no puedo usarlo. Voy a editar la pregunta ... –

Respuesta

11

creo que esto debería funcionar:

a_signal.connect(if_then(
        bind((std::string(*)(any&))&any_cast, var(_buffer)[_1]) == "foo", 
        bind(&base_class<>::a_method, 
        ll_static_cast< base_class<>* >(
        new_ptr<derived_class>() 
        ), 
        var(_buffer)[_1] 
        ) 
       ) 
); 

bind, if_then, ll_static_cast, new_ptr, _1, var (y, creo ref también) son miembros de boost::lambda.

Pero, honestamente, me negaría a trabajar con dicho código, personalmente :)

+2

+1 esto se ve horrible :) –

+0

gracias. Estaré muy feliz si puedo usar C++ 0x completamente :). Con su solución obtengo 'ninguna coincidencia para operator []' en las líneas donde '_buffer [_1]' se llama ... pero el 'operator []' existe en la clase buffer. ¿Tienes una idea de cómo resolverlo? –

+0

@Niels, olvidé envolverlos en 'var (..)'. Corregido :) –