
Hello Oliver, See inline below.. On Sun, 23 Nov 2008 15:31:12 +0100 "Olivier Tournaire" <olitour@gmail.com> wrote:
switch(priorType) { case 0: switch(dataType) { case 0: { MyModel<MyPriorEnergy,MyDataEnergy> aModel; aModel.SetInput(...); aModel.Optimize(...); } break; case 1: { MyModel<MyPriorEnergy,AnotherDataEnergy> aModel; aModel.SetInput(...); aModel.Optimize(...); } break; default: break; } case 1: switch(dataType) { case 0: { MyModel<MyPriorEnergy,MyDataEnergy> aModel; aModel.SetInput(...); aModel.Optimize(...); } break; case 1: { MyModel<MyPriorEnergy,AnotherDataEnergy> aModel; aModel.SetInput(...); aModel.Optimize(...); } break; default: break; } default: break; }
I would like to know if there is a way to automate the above switch generation. As I have 5 templates, and not only 2, this will really helps ... I tried using BOOST_PP_SEQ_FOR_EACH but did not came to a result. Then, there is a lot of duplication in the above code. Am I doing the right way ?
Looks like an awful lot of repetition, and would have to take a closer look at your problem for advice on design. However, to get you going, below is the Boost.PP work to do what you want - but think even that could be done better.. #include <boost/preprocessor/repetition/repeat.hpp> #include <boost/preprocessor/seq/for_each_i.hpp> #define ECKY(r, data, i, elem) \ case i: \ { \ MyModel<MyPriorEnergy, elem> aModel; \ aModel.SetInput(...); \ aModel.Optimize(...); \ } \ break; /**/ #define BAR(z, n, text) \ case n: \ swtich(dataType) \ { \ BOOST_PP_SEQ_FOR_EACH_I(ECKY, n, text) \ default: \ break; \ } /**/ #define FOO(n, seq) \ switch(priorType) \ { \ BOOST_PP_REPEAT(n, BAR, seq) \ default: \ break; \ } FOO(2, (MyDataEnergy)(AnotherDataEnergy)) Cheers, -- Manfred 24 November, 2008