Boost logo

Boost :

From: John Torjo (john.lists_at_[hidden])
Date: 2004-03-13 04:25:50


David Abrahams wrote:

>Hi,
>
>I have this code that isn't compiling because of the "forwarding
>problem" limitation of boost::bind:
>
> std::for_each(
> make_difference_iterator(p->second.begin())
> , make_difference_iterator(p->second.end())
> , boost::bind(&fu::writeVInt, &prox, _1));
>
>The problem is that an implicit conversion is required between the
>reference type of the difference_iterator and the argument type of
>writeVInt.
>
>It seems to me that, since I know that binding to an rvalue is
>required, we ought to have a way to say "force this to be a const
>ref". I thought of something like
>
> std::for_each(
> make_difference_iterator(p->second.begin())
> , make_difference_iterator(p->second.end())
> , boost::bind(&fu::writeVInt, &prox, boost::cref(_1)));
>
>

How about constifying the original sequence?
Something like:

        std::for_each(
            make_difference_iterator( constify( p->second.begin()))
          , make_difference_iterator( constify( p->second.end()))
          , boost::bind(&fu::writeVInt, &prox, boost::cref(_1)));

Of course, constify it's just too easy to implement:

template<class T> const T& constify(T &val) { return val; }

Best,
John


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk