Listing 2

class ProcessorMgr
{
private:
  std::map<std::string, void *> my_processors;
public:
  void addProcessor(std::string input_category, void * processor) 
  { my_processors[input_category] = func; }

  void processInput(std::string input_category, InputObj i)
  { my_processors.find(input_category)->second->operator()(i); }
}; 
class FooProcessor 
{ public: void operator(InputObj I) const {  /* ... */ } };

class BarProcessor 
{ public: void operator(InputObj I) const {  /* ... */ } };

int main()
{
  ProcessorMgr mgr;
  mgr.addProcessor("foo", new FooProcessor());
  mgr.addProcessor("bar", new BarProcessor());
  InputObj x1, x2;
  mgr.processInput("foo", x1);
  mgr.processInput("bar", x2);

  return 0;
}