2010-05-13 5 views
10

Considérons la pièce de code suivante C++ 0x:L'utilisation correcte de boost 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]); 
    }}); 

Quelle serait correctement Boost Lambda (puisque ce C++ 0x fonctionnalité ne peut pas être utilisé dans GCC 4.4 encore)?

+0

Vous * peut * utiliser C++ 0x fonction si le compilateur supporte. – kennytm

+2

OMG, la douleur! Arrête ça! (Bonne question, cependant.) –

+0

@KennyTM J'ai GCC 4.4 et il ne le supporte pas encore. GCC 4.5 le supporte (afaik) mais je ne peux pas l'utiliser. Je vais éditer la question ... –

Répondre

11

Je pense que cela devrait fonctionner:

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 (et, je pense ref aussi) sont membres de boost::lambda.

Mais honnêtement, je refuserais de travailler avec ce code, personnellement :)

+2

+1 cela semble hideux :) –

+0

merci. Je serai vraiment heureux si je peux utiliser complètement C++ 0x :). Avec votre solution j'obtiens 'aucune correspondance pour l'opérateur []' dans les lignes où '_buffer [_1]' est appelé .. mais le 'operator []' existe dans la classe buffer. Avez-vous une idée de comment le résoudre? –

+0

@Niels, j'ai oublié de les envelopper dans 'var (..)'. Fixe :) –

Questions connexes