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;
}