2010-05-13 4 views
10

Betrachten Sie das folgende Stück C++ 0x-Code:Korrekte Verwendung von 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]); 
    }}); 

Wie wäre es richtig in Boost-Lambda aussehen (da diese C++ 0x-Funktion nicht in GCC verwendet werden kann, 4.4 noch)?

+0

Sie * kann * verwenden C++ 0x-Funktion, wenn der Compiler unterstützt wird. – kennytm

+2

OMG, der Schmerz! Mach, dass es aufhört! (Gute Frage, though.) –

+0

@KennyTM Ich habe GCC 4.4 und es unterstützt es noch nicht. GCC 4.5 unterstützt es (afaik), aber ich kann es nicht benutzen. Ich werde die Frage bearbeiten ... –

Antwort

11

ich denke, das sollte funktionieren:

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 (und, ich glaube, ref auch) sind Mitglieder von boost::lambda.

Aber ehrlich gesagt, würde ich ablehnen, mit einem solchen Code zu arbeiten, persönlich :)

+2

+1 das sieht scheußlich aus :) –

+0

danke. Ich werde wirklich glücklich sein, wenn ich C++ 0x vollständig benutzen kann :). Mit Ihrer Lösung bekomme ich 'no match for operator []' in den Zeilen, in denen '_buffer [_1]' aufgerufen wird .. aber der 'operator []' existiert in der Pufferklasse. Hast du eine Idee, wie du es lösen kannst? –

+0

@Niels, ich habe vergessen, sie in 'var (..)' zu verpacken. Fixed :) –