2010-08-24 11 views
5

Supongamos que tengo una función que toma algún tipo de predicado:Usando impulso para crear una función lambda que siempre devuelve verdadero

void Foo(boost::function<bool(int,int,int)> predicate); 

Si quiero llamarlo con un predicado que siempre devuelve verdadero, puedo definir una función auxiliar:

bool AlwaysTrue(int, int, int) { return true; } 
... 
Foo(boost::bind(AlwaysTrue)); 

Pero hay alguna forma de llamar a esta función (posiblemente usando boost :: lambda) sin tener que definir una función separada?

[Editar: se olvidó de decir: no puedo usar C++ 0x]

Respuesta

9

UncleBens comentó esto en la respuesta de Scharron, pero creo que en realidad es la mejor respuesta, así que la estoy robando (lo siento UncleBens). Sólo tiene que utilizar

Foo(boost::lambda::constant(true)); 

Como se describe en the documentation for Boost.Lambda, sólo el mínimo de aridad el funtor es cero, la aridad máxima es ilimitada. Por lo tanto, cualquier entrada que pase al functor simplemente será ignorada.

+0

He estado echándole un vistazo y descubrí boost :: lambda :: identity ... ¿alguien sabe la diferencia? Ambos parecen funcionar. – stusmith

+0

identidad parece ser una clase de plantilla no documentada, utilizada en la implementación de constante (y boost :: lambda :: var). Al igual que std :: mem_fun_t es la clase que la función auxiliar std :: mem_fun crea y devuelve, excepto que mem_fun_t está documentado y la identidad no. Dado eso, recomendaría usar var y constante en su lugar. – SCFrench

4

Aquí está un ejemplo rápido:

#include <boost/function.hpp> 
#include <boost/lambda/lambda.hpp> 
#include <iostream> 

void Foo(boost::function<bool(int,int,int)> predicate) 
{ 
    std::cout << predicate(0, 0, 0) << std::endl; 
} 

int main() 
{ 
    using namespace boost::lambda; 
    Foo(true || (_1 + _2 + _3)); 
} 

El truco está en true || (_1 + _2 + _3) que va a crear una impulsar lambda con 3 argumentos (_1, _2 y _3), siempre devolviendo true.

+0

No sé lo suficiente sobre lambda para realmente responder, pero supongo que "Foo (true || _3)" también funcionaría – stefaanv

+4

Parece que incluso se puede hacer simplemente: 'Foo (constante (verdadero));' Esto es nulary, pero este es solo el arity mínimo del functor. – UncleBens

Cuestiones relacionadas