
I'm trying to recursively traverse an MPL vector_c but I'm not sure what the base-case type should be. I want to pick a type from a mpl::vector at runtime and use it to dispatch a call to an overloaded function. Basically tag-dispatch with the tags being looked up in an MPL collection. The runtime value is an unsigned it so I just store unsigned ints in a vector_c. Then I want to traverse this vector and compare each item to the runtime value. If I find a match, I want to use it to call an overloaded function. Here's how I'm trying to do it so far: template<typename ID> class message { ... } template<typename Sequence> // MAP is a vector_c struct dispatcher { template<typename T> static result dispatch(T* obj, unsigned int message_id, int arg) { typedef boost::mpl::front<Sequence>::type head; typedef boost::mpl::pop_front<Sequence>::type tail; if (head::value == message_id) return obj->handle(messagehead::value, arg); else return dispatcher<tail>::dispatch(obj, message_id, arg); } }; template<> struct dispatcherboost::mpl::void_ // WHAT SHOULD THIS TYPE BE? { template<typename T> static result dispatch(T* obj, unsigned int message_id, int arg) { return obj->default_message_handler(message_id, arg); } }; struct handler { result handle(message<MESSAGE1>) { /* do stuff 1 */ } result handle(message<MESSAGE2>) { /* do stuff 2 */ } result default_message_handler(unsigned int id, int arg) {} } I'm stuck on what to make the dispatcher base case which is reached when pop_front is called on a list with one item. At first I though the resulting type was void_ but apparently this doesn't match. I'm new to MPL. Can someone explain what I'm doing wrong here or if there's an altogether better way? Many thanks. Alex Lamaison