Listing 6

// ...
template<typename CLASSIFIER_TYPE>
class ProcessorMgr
{
 ...
  typedef std::map<CLASSIFIER_TYPE::return_type, 
    ProcessorInfo> PMap; 
 ...
  void processInput(InputObj i)
  { 
    CLASSIFIER_TYPE::return_type c = CLASSIFIER_TYPE().operator()(i);
    PMap::iterator p = my_processors.find(c);
    (p->second)(p->first, i);
  }; 
};
 ...
enum objtype { foo, bar };
class input_classifier { 
public: 
  typedef objtype return_type;
  objtype operator(const InputObj & i) const 
  { return i.getType(); }
};
int main()
{
  ProcessorMgr<input_classifier> mgr;
  mgr.addProcessor(foo, new FooProcessor());
  mgr.addProcessor(bar, new BarProcessor());
  InputObj x1, x2;
  mgr.processInput(x1);
  mgr.processInput(x2);

  return 0;
}