On Tuesday 12 November 2002 08:43 am, Yitzhak Sapir wrote:
> I would like to do a loop on all elements of a vector, and for each one
> call some function.  I'd like to attempt this function each time, even if
> exceptions are thrown, and since I don't care about those exceptions I'd
> like to wrap this in try{} catch(...) {} which I will refer to as an
> "exception sink".  The important thing is that this action be tried for
> each element of the vector.
>
> For any particular function, I can write such a forwarding functor.
> However, I have to do this several times, and it appears to me that this
> is a rather general use rather than for any specific functor.  However, to
> do this, I essentially have to replicate bind, only adding "try {}
> catch(...) {}" around it, calling it bind_with_exception_sink or
> something.
>
> A half-way solution would have been to perform the "placeholder binding"
> in one pass, and then pass the generated bound 0 argument functor to the
> exception-sink wrapper.  Then the exception-sink wrapper only has to deal
> with one kind of functor.  But this leaves the possibility of an exception
> happening during the placeholder binding.
> 
> Anyhow, I'm at a loss to see any solution to this, but I thought this
> might have been nice if it could have been done.  So for now, I end up
> writing a specific wrapper for each case.  But I thought I'd raise this,
> in case any of you have ideas as to how it could be done, or even if it is
> worth doing in the first place.  (A similar bind-like functor I can think
> of is one that calls new and then performs some operation, such as
> transform it to an auto_ptr).

Boost.Lambda can do this, because it has support for creating try/catch blocks 
on-the-fly. See:
  http://www.boost.org/libs/lambda/doc/ar01s05.html#sect:exceptions

You will probably have a function object like this (untested):

  try_catch(
    bind(your_function_object, _1),
    catch_all(var(exceptions_caught)++)
  )

        Doug
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to