Boost logo

Boost Users :

Subject: Re: [Boost-users] Bind questions
From: John Dlugosz (JDlugosz_at_[hidden])
Date: 2010-06-07 14:37:18


> The biggest difference I know of between boost::bind and
> std::tr1::bind is that the placeholders (_1, _2, ...) are moved from
> essentially being global scope to being in std::tr1::placeholders.
> There may be other differences, but I don't think they'd affect the
> usage you describe below.

OK, thanks.

>
> > Consider a member function C::foo.  If I want to bind the object this
> parameter but leave the rest unchanged, would bind(&C::foo,x)
> automatically give me bind(&C::foo,x,_1,_2,_3)?
> >
> It would not. At least with boost::bind the former doesn't work.
> Forgetting a placeholder has always been a good way for me to get an
> internal compiler error on VC8.
>
> > What if I want to call x->foo(5,_3) and not use the first two
> parameters or the 4th, to make something that is passed to a callback
> function that wants 4 arguments?  That is, the callback F is invoked
> F(a,b,c,d) and I want to make a function instance that can be assigned
> to F, and ends up calling x->foo(5,c).
>
> To be clear, are you referring to something like the following?
> #include <iostream>
>
> #include "boost/bind.hpp"
>
> struct C
> {
> void foo(int a, int b) const
> { std::cout << a << ';' << b << std::endl; }
>
> };
>
> int main()
> {
> C c;
> boost::bind(&C::foo, c, 5, _3)(1, 2, 3, 4);
>
> return 0;
> }
>
> Works for me:
> $ ./a.exe
> 5;3

Ah yes, I remember reading that extra parameters called are simply ignored, and the rationale that this is generally good for callbacks.

And, you clarify that the extra arguments are dropped, as opposed to filling in extra args for the binded target. I was wondering if you could pass the "incoming" signature separate from having it deduced from the first argument to bind. As it exists now, "bind" supplies all arguments to the bound call, some of which may be placeholders. You don't leave off trailing placeholders. Right? There is no "bind first n" function.
Now your example shows extra arguments ignored when calling the function object returned by bind, but the desired type was never given.

        function<void (int,int,int,int)> callback;
        callback= bind...

Will that, in general, adapt the result of bind when assigned? More to the point, what is the purpose of the signature in the function object, if the function's operator() takes anything and throws away extras, besides? I'm basically lost when it comes to what is typed, where, and when.

--John

TradeStation Group, Inc. is a publicly-traded holding company (NASDAQ GS: TRAD) of three operating subsidiaries, TradeStation Securities, Inc. (Member NYSE, FINRA, SIPC and NFA), TradeStation Technologies, Inc., a trading software and subscription company, and TradeStation Europe Limited, a United Kingdom, FSA-authorized introducing brokerage firm. None of these companies provides trading or investment advice, recommendations or endorsements of any kind. The information transmitted is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. Any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and delete the material from any computer.


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