2010-08-24 19 views
5

Załóżmy, że mam funkcja, która zajmuje pewną formę predykatu:Korzystanie impuls aby utworzyć funkcję lambda, która zawsze zwraca true

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

Jeśli chcę nazywać go z orzeczeniem, które zawsze zwraca wartość true, mogę zdefiniować funkcja pomocnika:

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

Ale czy jest tak, aby wywołać tę funkcję (ewentualnie przy użyciu boost :: lambda) bez konieczności definiowania oddzielną funkcję?

[Edit: Zapomniałem powiedzieć: Nie mogę korzystać z C++ 0x]

Odpowiedz

9

UncleBens skomentował to w odpowiedzi Scharrona, ale uważam, że jest to najlepsza odpowiedź, więc kradnę ją (przepraszam UncleBens). Wystarczy użyć

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

Jak opisano w the documentation for Boost.Lambda, tylko minimalna arity z funktora jest zero, maksymalna arity jest nieograniczona. Więc wszelkie dane wejściowe przekazywane funktorowi będą po prostu ignorowane.

+0

Sam się obejrzałem i natknąłem się na boost :: lambda :: identity ... ktoś zna różnicę? Obaj wydają się działać. – stusmith

+0

Identyfikacja wydaje się być nieudokumentowaną klasą szablonów, używaną w implementacji stałej (i boost :: lambda :: var). Podobnie jak std :: mem_fun_t jest klasą, którą funkcja pomocnicza std :: mem_fun tworzy i zwraca, z tą różnicą, że mem_fun_t jest udokumentowane, a tożsamość nie. Biorąc to pod uwagę, polecam używanie var i constant zamiast tego. – SCFrench

4

Oto krótki przykład:

#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)); 
} 

Sztuką jest w true || (_1 + _2 + _3) gdzie tworzysz zwiększenie lambda z 3 argumentami (_1, _2 i _3), zawsze zwracając true.

+0

Nie wiem wystarczająco dużo o lambda, aby odpowiedzieć, ale zakładam, że "Foo (true || _3)" również będzie działało – stefaanv

+4

Wygląda na to, że możesz nawet zrobić: 'Foo (constant (true));' Jest to wartość null, ale jest to tylko minimum arii funktora. – UncleBens

Powiązane problemy