Boost logo

Boost :

From: Darren Cook (darren_at_[hidden])
Date: 2004-05-14 04:38:02


>>best2=bind(&Node::value2,
>> bind( &std::vector<Node>::at, //Ask for an element
>> bind(&Node::children,_1), //Get the vector object
>> 0 ) //Ask for element zero
>> );

> It's simple, compiler can't guess which function "at" you try to bind.
>
> See overloading section of lambda documentation.

I couldn't see a section on overloading, or that dealt with this problem. Do
you know the section number/title in the docs? Or perhaps it was an article
somewhere else?

> typedef std::vector<int> ints;
> typedef ints::const_reference ( ints::*ConstAtFunc ) (ints::size_type) const;
> Now call bind with ConstAtFunc( at ) as function

Thanks, that worked (and with operator[] as well):

typedef std::vector<Node>::const_reference
    ( std::vector<Node>::*ConstVectorFunc )
    (std::vector<Node>::size_type)
    const;

best2=bind(&Node::value2,
            bind( ConstVectorFunc(&std::vector<Node>::at),
            bind(&Node::children,_1), 0 ) );

best2=bind(&Node::value2,
            bind( ConstVectorFunc(&std::vector<Node>::operator[]),
            bind(&Node::children,_1), 0 ) );

However I don't really understand what is going on. Is there a way to do
this without using the typedef? I tried cref() around various parameters but
  cannot get that to compile.

Darren


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