$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Alexander Nasonov (alnsn_at_[hidden])
Date: 2006-07-19 15:49:47
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://listarchives.boost.org/mailman/listinfo.cgi/boost