First, the working code:
#include
#include
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct message
{
string mtablename;
unsigned long long mpk;
message(const string& tablename, const unsigned long long pk) :
mtablename(tablename), mpk(pk) { }
};
typedef boost::function < void, unsigned long long > MessageFunctor;
typedef multimap < string, MessageFunctor > MessageFunctorMap;
typedef pair < MessageFunctorMap::iterator,
MessageFunctorMap::iterator > MessageFunctorTableMapIteratorPair;
void callfunctor(pair < string, MessageFunctor > item, unsigned long
long pk)
{
item.second(pk);
}
class MessageCenter
{
MessageFunctorMap mHandlerMap;
public:
MessageCenter() { }
void sendMessage(message& amessage)
{
MessageFunctorTableMapIteratorPair iterPair =
mHandlerMap.equal_range(amessage.mtablename);
std::for_each(iterPair.first, iterPair.second, boost::bind
(&callfunctor, _1, amessage.mpk)); // QUESTION LINE
}
void addHandler(string tableName, MessageFunctor handler)
{
mHandlerMap.insert(make_pair(tableName, handler));
}
};
int gFooCounter = 0;
void fooHandler(unsigned long long x)
{
cout << "fooHandler called on pk=" << x << endl;
gFooCounter++;
}
void gooHandler(unsigned long long x){}
int main(int argc, const char** argv)
{
MessageCenter messageCenter;
messageCenter.addHandler("foo", fooHandler);
messageCenter.addHandler("foo", fooHandler);
messageCenter.addHandler("goo", gooHandler);
// send some messages
message fooMessage("foo", 123);
messageCenter.sendMessage(fooMessage);
if(gFooCounter != 2)
cerr << "something didn't work";
else
cout << "everything worked..." << endl;
return 0;
}
now for the question:
on the line labeled "QUESTION LINE", you can see that I'm
binding to
a functor called "callfunctor". All callfunctor does is call
the
functor embedded in the map's pair.
Is there a way to simplify the line in question so that I don't
need
to create the functor just to get access to the pair.second member?
-Darin