Io adotterei un approccio diverso basato su oggetti funzione.
codice:
struct MenuItem {
   virtual void execute()=0;
};


struct MenuItemA : public MenuItem {
   Type1 param1;
   Type2 param2;
   void execute() {
       // qualcosa con param1 e param2
   }
};

struct MenuItemB : public MenuItem {
   Type1 param1;
   Type2 param2;
   Type1 param3;
   Type1 param4;
   void execute() {
       // qualcosa con param1, param2, param3, param4
   }
};

vector<MenutItem*> menuList;
menuList.push_back(new MenuItemA);
menuList.push_back(new MenuItemB);

for(int i=0;i<menuList.size();i++) {
   menuList[i]->execute();
}
Ovviamente prima dovrai settare i parametri delle varie classi.