
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