Boost logo

Boost Users :

From: Mark Sizer (boost_at_[hidden])
Date: 2003-09-04 17:26:15


I'm new to boost::bind and boost::mem_fn. I've read the documentation
and I think I understand what they do, but I'm not sure how to use them
to accomplish my task.

I have a class that contains several vectors in a map. I want to put a
"foreach" method on the class that will callback an arbitrary member
function, of an arbitrary class, for each item in the vector.

I'm stuck on the signature of that method.

A quick sketch of the structure:

class VectorContent
{
   public:
     void dosomething();
     // there are bunches more, which is why I don't
     // want a foreach for every possible choice.
};

class VectorHolder
{
   std::map<std::string, std::vector<VectorContent> >;
   std::vector<VectorContent>& rvectGet(const std::string& rksName);

   public:
    void foreach( const std::string& rksName, <WHAT?> );
};

// the callback
Caller::Bar( VectorContent& vc )
{
   vc.dosomething();
}

I see two options for the caller:

// option 1
Caller::Foo1()
{
   VectorHolder callee;
   // in this case, foreach uses boost::mem_fn(), not me
   callee.foreach( "VectorName", &this::Bar );
}
// option 2
Caller::Foo2();
{
   VectorHolder callee;
   callee.foreach( "VectorName", boost::mem_fn(&this::Bar) );
}

In the case of option 1, all callers must share a common base class,
which they do NOT, so that the signature of VectorHolder::foreach can be:

typedef void (BaseClass::* MyCallBack)(VectorContent&);

Leading to:
void VectorHolder::foreach( const std::string& rsName,
                             MyCallBack callback )
{
   std::vector<VectorContent>& rvect = rvectGet( rsName );
   std::for_each( rvect.begin(), rvect.end(), boost::mem_fn(callback) );
}

In the case of option 2, I have no idea what the signature should be.
But the resulting method would be:

void VectorHolder::foreach( std::string& rsName,
                             WHAT? callback )
{
   std::vector<VectorContent>& rvect = rvectGet( rsName );
   std::for_each( rvect.begin(), rvect.end(), callback );
}

Grateful for any help,

  - Mark

P.S. If there's an "option 3", I'm up for that, too.


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net