templates - c++ - other way of implementing function calls in switch cases -
i've got code below:
void cashflow::execute (int cmd) { switch(cmd): { case buy: buyproc (); break; case sell: sellproc (); break; ...... } } what i'm thinking of doing maybe create map std::map <int, void (cashflow::*)()> cashflowprocs;
then maybe use mcashflowprocs = boost::assign::map_list_of (buy, &cashflow::buyproc)(...etc)(..etc.);
then can call (this->(mcashflowprocs [cmd]))();
how turn template can reused? there issues implementation?
note not using c++11
could there issues implementation?
yes, hard maintain, adding/removing command need lot of maintenance, error prone, , difficult test. suggest design change before trying improve particular code.
1 - if can change design:
use class represent command
class command { public: virtual void execute() = 0; virtual ~command() {};; }; class buycommand : public command { public: virtual void execute() { cout << "buy"; } }; class sellcommand : public command { public: virtual void execute() { cout << "sell"; } }; // ... command* bc = new buycommand(); // ... bc->execute(); 2 - if (unfortunately) cant change design way
if cmd enumeration known @ compile time, , has limited size, can use array of boost::function, , should regroup command in enum instead of using int.
enum { buy = 0; sell = 1; nb_cmds= 2 }; ... boost::array<nb_cmds, boost::function<void()>> // n number of commands. indexing array with, cmd, call function has index cmd in array.
if don't know @ compile time how many commands/functions need, might need replace array std::vector.
if 1 day can use c++11, replace boost:: std:: in above snippets.
Comments
Post a Comment