|
Boost : |
From: Mark Rodgers (mark.rodgers_at_[hidden])
Date: 2001-08-17 15:43:46
> > > The two libraries will then coexist as long as mem_fun.hpp is included
> > > before functional.hpp.
> >
> > I am absolutely opposed to this idea.
>
> Not good. Do you have a better idea?
We could take just those templates which overlap and place them into a
separate header included by functional.hpp and mem_fun.hpp.
> I think that it does not. For a member function int (X::*) (int, int &),
it
> will take the second argument by value and the third by reference.
Yes, you are correct. In fact I used call_traits to avoid an extra copy
when passing by value. My mistake.
> > so why not only allow the latter form?
>
> Not pay for what you don't use?
Well, I strongly suspect that only the zero and one argument forms of your
mem_fun will ever get used directly - all other uses will be via bind when
a member function with more arguments will be reduced to something that can
be used with a standard algorithm. If this is true then exposing mem_fun
provides no benefit *except* for smart pointer types, when an extension to
mem_fun is indeed useful.
> Assume that bind.hpp is submitted for inclusion in the standard library
but
> is rejected; do you still feel that mem_fun should not be proposed at all?
>
> void k(std::vector<boost::shared_ptr<X> > const & v)
> {
> std::for_each(v.begin(), v.end(), boost::mem_fun(&X::f));
> };
>
> is a useful generalization that will become more frequent when shared_ptr
> moves into std.
Agreed.
> Are you saying that because, in this specific case, 'bind' does not bind,
it
> doesn't deserve the name? There are many other cases where it does bind.
Yes, but where you write
bind( &X::f, _1, _2 )
what you really want (I believe) to write is
_1->f( _2 )
and it's just that you can't do this. I think the name should reflect what
you are really trying to do - call a function. "bind" is a complete
misnomer.
Sometimes I use my hammer to extract nails. Does that mean I should really
call it a "nail extracter"?
> Overall, I think that you should simply vote for rejection. I don't have a
> problem with that. In fact it's about time for Boost to reject something
> just to set a precedent, or it will grow uncontrollably. :-)
No because actually I want this library to be included. I already have a
set of templates I use like this:
void CompositeObject::f( int i, double d, const string &s )
{
std::for_each( m_elements.begin(), m_elements.end(),
call( &Object::f, i, d, s ) );
}
I see an opportunity to replace these with "bind", but preferably under a
new name.
Mark
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk