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

Можно ли создать встроенную лямбду, используя boost, который всегда вызывает исключение?

(этот вопрос следует из "Использование boost для создания лямбдыфункция, которая всегда возвращает истину ").

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

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

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

bool AlwaysThrow( int, int, int ) { throw std::exception(); }
...
Foo( boost::bind( AlwaysThrow ) );

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

(Примечание 1: я не могу использовать C ++ 0x.)

(Примечание 2: я упростил этот пример. Моя настоящая функция "предиката" невозвращает bool, он возвращает тип, у которого нет ctor по умолчанию.)

1 Ответ

4 голосов
/ 25 августа 2010

В Boost.Lambda есть функция a throw_exception .

Например :

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

#include <exception>
#include <iostream>

struct Bar {
    private:
        Bar() {}
};

void Foo(boost::function<Bar(int,int,int)> predicate) {
    std::cout << "should show" << std::endl;
    predicate(1,2,3);
    std::cout << "should not show" << std::endl;
}

int main () {
    Foo( boost::lambda::ret<Bar>(boost::lambda::throw_exception( std::exception() ) ) );
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...