Listing 4

struct InputObj {};

class ProcessorMgr
{
private:
  typedef void (ProcessorMgr::*processingFunction) 
  (void *, InputObj);

  struct ProcessorInfo 
  { void * processor; processingFunction func; };

  typedef std::map<std::string, ProcessorInfo> PMap; 
  PMap my_processors;
public:
  template<class PROCESSOR_TYPE>
  void proxyFunc(void * processor, InputObj i)
  { ((PROCESSOR_TYPE*)processor)->operator(i); }

  template<class PROCESSOR_TYPE>
  void addProcessor(std::string input_category, PROCESSOR_TYPE * processor)  
  { 
    my_processors[input_category].processor =  processor;
    my_processors[input_category].func = proxyFunc<PROCESSOR_TYPE>;
  }
  void processInput(std::string input_category, InputObj i)
  { 
    PMap::iterator p = my_processors.find(input_category);
    (p->second)(p->first, 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(x1);
  mgr.processInput(x2);

  return 0;
}