2011-01-05 13 views
15

Ho alcune funzioni lambda che voglio associare usando boost :: bind o std :: bind. (Non importa quale, finché funziona.) Purtroppo entrambi mi danno diversi erros compilatore:Come utilizzare le funzioni lambda con 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>' 

Quindi, qual è la soluzione più semplice per questo?

+0

Perché si desidera utilizzare il bind? Non puoi semplicemente chiamare f() o f2 (1)? – Jagannath

+3

@Jagannath: Questo era ovviamente solo un semplice esempio, ma in realtà voglio memorizzare il risultato del bind in un oggetto funzione. – Timo

+0

Perché vuoi usare il bind? Pensavo che C++ 0x fornisse chiusure? –

risposta

20

È necessario specificare manualmente il tipo di ritorno:

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

Puoi anche scrivere da soli un modello-funzione per dedurre il tipo di ritorno automagicamente utilizzando Boost.FunctionTypes per ispezionare operatore del lambda(), se si don Mi piace dire esplicitamente 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

Solo se 'function' introduce runtime-indirection e' bind' è più veloce ... E '? – Dario

+0

Dubito che chiamare il funtore risultante dal binding sia mai più veloce poiché il risultato del binding aggiunge nella maggior parte dei casi ancora un altro livello di riferimento indiretto. probabilmente sarà necessario il binding in situazioni in cui alcuni parametri devono essere vincolati. Nell'esempio sopra std: bind (f2, 13)(); lega il primo parametro al valore costante 13. Il risultato del binding è un "functor" che non accetta parametri e restituisce void. – ds27680

+0

Chiamare il risultato di 'bind' potrebbe essere leggermente più veloce, poiché non c'è chiamata attraverso una funzione virtuale come con' function'. – ltjax

1

Penso che potresti essere interessato a this MSDN forum post. Sembra che il poster abbia avuto lo stesso problema del tuo e ha introdotto un bug con MS Connect.

Problemi correlati