On Thu, Mar 27, 2008 at 11:30 AM, Steven Watanabe
AMDG
Robert Dailey wrote:
It's sad to find out about the restrictions of the templates, but I can understand. I just finally began to understand your design proposal and had already planned on using it :(
Well, you could use MPL list which does not have a fixed upper limit, but you may just run into compiler limits instead of MPL limits.
Your unordered_map seems redundant, in that you have packet ID's to different function objects with exactly the same signature. I guess this is so we only dispatch packets to subscribers interested in that specific packet. Could you emphasize a little more on what you mean by "store references to the individual signals"? The downcasting logic could be done via a 'get' method.... packet::get<WalkPacket>(), but this is pretty much exactly like doing static_cast<>() directly. get() would have the potential of returning a NULL auto_ptr if the type specified by the get<>() does not represent the concrete type of the packet.
typedef boost::unordered_map
> dispatcher; template<class T> struct StaticCaster { StaticCaster(boost::signal
&signal) : signal(signal) {} boost::signal &signal; void operator()(Packet const& packet) const { signal(static_cast (packet)); } }; // load the table. // you will probably need a second map to allow functions to // be registered with the signals.
boost::signal
walkPacketSignal; dispatcher.insert(make_pair(PID_WALKPACKET, staticCaster<WalkPacket>(walkPacketSignal))); // dispatching
dispatcher[id](packet);
Subscription doesn't seem as simple as you proposed. I looked into possible designs for subscribing to the signals and nothing is working out. There's no way to generate a second map to provide slot connections, since the signal object is actually owned by the first map, and thus the two cannot share them. Secondly, the slots (given the design above) each have a different signature for each packet, which further complicates things. Any suggestions? I'm having trouble thinking outside the box...