2011-01-05 27 views
15

Tengo algunas funciones lambda que quiero vincular usando boost :: bind o std :: bind. (No importa cuál, siempre y cuando funciona.) Desafortunadamente ambos me dan diferentes erros del compilador:Cómo usar las funciones de lambda con boost :: bind/std :: bind en 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>' 

Así que, ¿cuál es la solución más simple para esto?

+0

¿Por qué quieres usar bind? ¿No puedes simplemente llamar a f() o f2 (1)? – Jagannath

+3

@Jagannath: Esto fue, por supuesto, solo un ejemplo simple, pero en realidad quiero almacenar el resultado del enlace en un objeto de función. – Timo

+0

¿Por qué quieres usar bind? Pensé que C++ 0x proporcionaba cierres? –

Respuesta

20

Es necesario especificar manualmente el tipo de retorno:

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

También puede escribir a sí mismo una función de plantilla para deducir el tipo de retorno automagicamente usando Boost.FunctionTypes para inspeccionar el operador de su lambda(), si no Me gusta decirle explícitamente a 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 si 'function' introduce runtime-indirection y' bind' es más rápido ... ¿Lo es? – Dario

+0

Dudo que llamar al functor resultante de un enlace sea más rápido ya que el resultado del enlace agrega en la mayoría de los casos otro nivel de indirección. bind probablemente se requerirá en situaciones donde algunos parámetros deben estar vinculados. En el ejemplo anterior std :: bind (f2, 13)(); vincula el primer parámetro al valor constante 13. El resultado del enlace es un "functor" que no toma parámetros y devuelve vacío. – ds27680

+0

Llamar al resultado de 'bind' podría ser un poco más rápido, ya que no hay llamadas a través de una función virtual como con' function'. – ltjax

1

Creo que le puede interesar this MSDN forum post. Parece que el póster tuvo el mismo problema que el suyo y presentó un error con MS Connect.

Cuestiones relacionadas