
On 6/8/06, Peter Dimov <pdimov@mmltd.net> wrote:
Dean Michael Berris wrote:
//set up a registry dispatch::dispatcher<void (), int> callbacks;
// register a nullary free function f to index 0 callbacks[0] = f;
// bind arguments to a single argument function p to index 1 callbacks[1] = boost::bind(p, 1);
// get user input then execute appropriate callback int i; cin >> i; callbacks[i]();
This can be done with map< int, function<void()> >.
Yes, this is just one of the things that the dispatcher can do. The current implementation (lacking documentation) can be downloaded from http://tinyurl.com/px33v -- there are a few other uses, including a means for defining a strategy for index validation. An example of this usage is shown below (and can also be seen from the unit test): #include <iostream> #include "dispatch.hpp" int function_returns_int (int j) { return j+1; }; struct require_even_strategy { bool operator() (int number) const { return (number != 0) && ((number % 2) == 0); }; }; typedef dispatch::dispatcher<int(), int, require_even_strategy, std::vector> dispatcher_t; int main(int argc, char **argv) { dispatcher_t d; d[2] = boost::bind(function_returns_int, 3); d[4] = boost::bind(function_returns_int, 5); dispatcher_t::collection_type v = d.dispatch(2); std::cout << v[0] << ", " << v[1] << std::endl; return 0; } Future direction is support for asynchronous and thread safe invocations of operator[] and dispatch(). It does implement some of the Boost.Signals functionality in the dispatch() call, but (though I certainly haven't tried yet) I'd think it will work well with signals too. And yes, the dispatcher holds an std::map of wrappers to boost::function<> instances. -- Dean Michael C. Berris C/C++ Software Architect Orange and Bronze Software Labs http://3w-agility.blogspot.com/ http://cplusplus-soup.blogspot.com/ Mobile: +639287291459 Email: dean [at] orangeandbronze [dot] com