2010-08-25 6 views
2

Est-il possible de créer un lambda en ligne en utilisant boost qui lance toujours une exception?Utiliser boost pour créer une fonction lambda qui lance toujours

(cette question fait suite à "Using boost to create a lambda function which always returns true").

Supposons que j'ai une fonction qui prend une certaine forme de prédicat:

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

Si je veux l'appeler avec un prédicat qui jette toujours une exception, définir une fonction d'assistance:

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

Mais y at-il de toute façon à appeler cette fonction (éventuellement en utilisant boost :: lambda) sans avoir à définir une fonction séparée?

(Note 1:. Je ne peux pas utiliser C++ 0x)

(Note 2: J'ai simplifié cet exemple fonction Ma réelle "sous-jacente" ne renvoie pas bool,. retourne un type qui n'a pas de défaut-ctor.)

Répondre

4

Il y a a throw_exception function dans Boost.Lambda.

For example:

#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; 
} 
Questions connexes