2011-01-05 14 views
15

Ich habe einige Lambda-Funktionen, die ich entweder mit boost :: bind oder std :: bind binden möchte. (Unbeachtlich, die man, solange es funktioniert.) Beide von ihnen leider verschiedene Compiler erros geben Sie mir:Wie verwendet man Lambda-Funktionen mit boost :: bind/std :: bind in VC++ 2010?

auto f = [](){ cout<<"f()"<<endl; }; 
auto f2 = [](int x){ cout<<"f2() x="<<x<<endl; }; 

std::bind(f)(); //ok 
std::bind(f2, 13)(); //error C2903: 'result' : symbol is neither a class template nor a function template 

boost::bind(f)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda0>' 
boost::bind(f2, 13)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda1>' 

Also, was ist die einfachste Abhilfe für dieses?

+0

Warum möchten Sie binden? Kannst du nicht einfach f() oder f2 (1) anrufen? – Jagannath

+3

@Jagannath: Das war natürlich nur ein einfaches Beispiel, aber in Wirklichkeit möchte ich das Bindungsergebnis in ein Funktionsobjekt speichern. – Timo

+0

Warum möchten Sie binden? Ich dachte C++ 0x zur Verfügung gestellt Schließungen? –

Antwort

20

Sie müssen den Rückgabetyp manuell angeben:

boost::bind<void>(f)(); 
boost::bind<int>(f2, 13)(); 

Sie können sich auch schreiben Sie eine Vorlage-Funktion den Rückgabetyp automatisch mit Boost.FunctionTypes abzuleiten Ihre Lambda des Betreibers() zu inspizieren, wenn Sie don möchte nicht explizit sagen bind.

8
std::function<void()> f1 = [](){ std::cout<<"f1()"<<std::endl; }; 
std::function<void (int)> f2 = [](int x){ std::cout<<"f2() x="<<x<<std::endl; }; 
boost::function<void()> f3 = [](){ std::cout<<"f3()"<<std::endl; }; 
boost::function<void (int)> f4 = [](int x){ std::cout<<"f4() x="<<x<<std::endl; }; 

//do you still wanna bind? 
std::bind(f1)(); //ok 
std::bind(f2, 13)(); //ok 
std::bind(f3)(); //ok 
std::bind(f4, 13)(); //ok 

//do you still wanna bind? 
boost::bind(f1)(); //ok 
boost::bind(f2, 13)(); //ok 
boost::bind(f3)(); //ok 
boost::bind(f4, 13)(); //ok 
+0

Nur wenn 'function' Laufzeit-Indirection einführt und' bind' ist schneller ... oder? – Dario

+0

Ich bezweifle, dass der Funktor, der aus Bind resultiert, jemals schneller sein würde, da das Bind-Ergebnis in den meisten Fällen noch eine weitere Stufe der Indirektion hinzufügt. bind wird wahrscheinlich in Situationen benötigt, in denen einige Parameter gebunden werden müssen. Im obigen Beispiel std :: bind (f2, 13)(); bindet den ersten Parameter an den konstanten Wert 13. Das Ergebnis der Bindung ist ein "Funktor", der keine Parameter akzeptiert und void zurückgibt. – ds27680

+0

Das Ergebnis von 'bind' könnte etwas schneller sein, da es keinen Aufruf durch eine virtuelle Funktion wie bei' function' gibt. – ltjax

1

Ich glaube, Sie könnten interessiert sein an this MSDN forum post. Klingt so, als hätte das Poster das selbe Problem wie Sie, und hat einen Fehler bei MS Connect gemeldet.

Verwandte Themen