Boost logo

Boost Users :

From: David Abrahams (dave_at_[hidden])
Date: 2005-10-28 11:52:06


Daniel Lidström <daniel.lidstrom_at_[hidden]> writes:

> Now to my problem: A PxyPoint is a sub class to DataObject, and
> PxyFileData::GetPoints() returns a DataObject where all the children
> are PxyPoint's. Now I would like to call a member function,
> PxyPoint::PutSpCode(const char*), on each of the children, like
> this:
>
> void put_sp_code(DataObject&, const char*);
>
> void test()
> {
> shared_ptr<PxyFileData> file(...);
>
> DataObject& points = file->GetPoints();
> put_sp_code(points, "spcode");
> }
>
> void put_sp_code(DataObject& points, const char* code)
> {
> std::for_each(points.begin(), points.end(),
> std::bind2nd(std::mem_fun(&PxyPoint::PutSpCode), code));

If PutSpCode is a virtual function on DataObjects, it's easy.

    // Using Boost.Bind because the standard binders are too tricky for
    // me to get right (untested);
    std::for_each(points.begin(), points.end(),
       boost::bind(&DataObject::PutSpCode, _1, code));

Otherwise I don't think you could reasonably expect anything like this
to work without a cast. You'd need to create a function object with a
cast in it:

    // using Boost.Lambda (untested)
    std::for_each(points.begin(), points.end(),
       (&boost::ll_dynamic_cast<PxyPoint&>(_1))->*(&PxyPoint::PutSpCode)(code));

or
       
    std::for_each(points.begin(), points.end(),
       (&boost::ll_static_cast<PxyPoint&>(_1))->*(&PxyPoint::PutSpCode)(code));
       

> Is this possible with our design? I would like to be able to do this
> without having to create a PxyPointList, that derives from
> DataObject and only stores PxyPoint's (my guess is that something
> like that would work with this code).

I can't tell for sure, but this has all the markings of a design
that's trying to use runtime polymorphism where it should be using
compile-time polymorphism, in some form or other.

BTW, what does any of this have to do with iterator_facade?

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com

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