Использование boost для создания лямбда-функции, которая всегда возвращает true

Предположим, у меня есть функция, которая принимает некоторую форму предиката:

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

Если я хочу вызвать его с помощью предиката, который всегда возвращает истину, я могу определить вспомогательную функцию:

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

Но есть ли способ вызвать эту функцию (возможно, используя boost :: lambda) без необходимости определять отдельную функцию?

[Изменить: забыл сказать: Я НЕ МОГУ использовать C ++ 0x]


person stusmith    schedule 24.08.2010    source источник


Ответы (2)


UncleBens прокомментировал это в ответе Шаррона, но я думаю, что на самом деле это лучший ответ, поэтому я его ворую (извините, UncleBens). Просто используйте

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

Как описано в документации для Boost.Lambda только минимальная арность функтора равна нулю, максимальная арность не ограничена. Таким образом, любые входные данные, переданные в функтор, будут просто игнорироваться.

person SCFrench    schedule 24.08.2010
comment
Я сам смотрел и наткнулся на boost :: lambda :: identity ... кто-нибудь знает разницу? Кажется, они оба работают. - person stusmith; 25.08.2010
comment
identity выглядит недокументированным шаблонным классом, используемым в реализации константы (и boost :: lambda :: var). Подобно std :: mem_fun_t, это класс, который создает и возвращает вспомогательная функция std :: mem_fun, за исключением того, что mem_fun_t документирован, а идентификатор - нет. Учитывая это, я бы рекомендовал вместо этого использовать var и constant. - person SCFrench; 25.08.2010

Вот краткий пример:

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

Уловка заключается в true || (_1 + _2 + _3), где вы создаете повышающую лямбду с 3 аргументами (_1, _2 и _3), всегда возвращая true.

person Scharron    schedule 24.08.2010
comment
Я недостаточно знаю о лямбде, чтобы ответить, но я предполагаю, что Foo (true || _3) также будет работать - person stefaanv; 24.08.2010
comment
Похоже, вы даже можете просто: Foo(constant(true)); Это нулевой, но это только минимальная арность функтора. - person UncleBens; 24.08.2010