
Jeremy Day wrote:
One more idea to improve maintainability of client code:
class my_exceptions_handler { BOOST_DEFINE_EXCEPTION_HANDLER_FIRST(exception_type, exception_variable, 1) { //code here } BOOST_DEFINE_EXCEPTION_HANDLER(exception_type2, exception_variable, 1, 2) { //code here } BOOST_DEFINE_EXCEPTION_HANDLER(exception_type2, exception_variable, 2, 3) { //code here } BOOST_DEFINE_EXCEPTION_HANDLER_LAST(exception_type, exception_variable, 3) { //code here } };
These macros automatically define exceptions list eliminating last piece of code duplication. numbers are used to decorate typelist' name that is already defined.
I'm not sure that I understand the need for the _FIRST and _LAST versions of the BOOST_DEFINE_EXCEPTION_HANDLER macro. I also don't understand why I need to decorate the typelist's name. If you have some pseudocode in mind for the definitions of BOOST_DEFINE_EXCEPTION_HANDER_FIRST, BOOST_DEFINE_EXCEPTION_HANDER, and BOOST_DEFINE_EXCEPTION_HANDER_LAST I'd be happy to look into this.
Note different number of arguments in these macros. It describes need for BOOST_DEFINE_EXCEPTION_HANDLER_FIRST. it defines handler and typedef for exceptions typelist with name decorated by its last argument. (with BOOST_PP_CAT(A, B) macro) BOOST_DEFINE_EXCEPTION_HANDLER defines handler and defines a typedef that extends (with mpl stuff) typedef generated by BOOST_DEFINE_EXCEPTION_HANDLER_FIRST macro. Its third parameter is used to restore the last defined exceptions typelist's name and last parameter is used to decorate name of typelist generated by it's own. BOOST_DEFINE_EXCEPTION_HANDLER_LAST defines the final exceptions typedef. It doesn't needs parameter to decorate it, only one to know a name of the last defined typelist name. Note, that parameters mentioned are not restricted to be numbers, but any sequence of numbers, letters and underscores. Hope it helps. Best, Oleg Abrosimov.