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

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

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

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 24 августа 2010

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

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

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

4 голосов
/ 24 августа 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...