
I don't know a practical value of this library except probably a management of exception handlers order but I can suggest (rather theoretical at this time) modification of your code to get rid of code duplication. Classes in your example appear in mpl::vector and inside operator(): struct my_exception_handler { typedef boost::mpl::vector<std::logic_error, std::exception> exceptions; // HERE ^^^^^^^^^^^^^^^^ void operator()(std::exception& oError); void operator()(std::logic_error& oError); // AND HERE ^^^^^^^^^^^^^^^^ void operator()(void); }; For compilers that support typeof, you could do this: struct my_exception_handler { void operator()(id<1>, std::exception& oError) const; void operator()(id<2>, std::logic_error& oError) const; void operator()(id<3> /* void */ ) const; }; Note the first agruments id<1>, id<2> and id<3>. You can get more information about how this magic works here: http://thread.gmane.org/gmane.comp.lib.boost.devel/117532 -- Alexander Nasonov Project Manager at Akmosoft ( http://www.akmosoft.com ) Blog: http://nasonov.blogspot.com Email: $(FirstName) dot $(LastName) at gmail dot com Jeremy Day wrote:
All,
A message a few days ago, along with my current reading of the book 'C++ Template Metaprogramming', piqued my interest in the idea of an "exception visitor". I put together a little something, and I'm wondering if people might be interested in my (rather poor, at the moment) code.
Problem:
When using exceptions it is very easy to end up with code that looks something like this:
try { //Some code that might throw exceptions. } catch(std::logic_error&) { //Handle the exception. } catch(std::exception&) { //Handle exception. } catch(...) { //Handle everything else }
With my code you can transform the above into something along these lines:
struct my_exception_handler { typedef boost::mpl::vector<std::logic_error, std::exception> exceptions;
void operator()(std::exception& oError) { std::cout << "my_exception_handler::operator()(std::exception&)" << std::endl; }
void operator()(std::logic_error& oError) { std::cout << "my_exception_handler::operator()(std::logic_error&)" << std::endl; }
void operator()(void) { std::cout << "my_exception_handler::operator()(void)" << std::endl; } };
//Application code.
try { //Some code that might throw exceptions, such as: throw std::logic_error("A sample logic error."); } catch(...) { //Magic happens here. catcher(my_exception_handler()); //This prints out "my_exception_handler::operator()(std::logic_error&)" }
If anyone is interested I will post what I have for critique (I'm a relative newbie with MPL, so I will likely need a lot of help). I look forward to any and all comments.
Jeremy _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost