Boost logo

Boost Users :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2007-01-11 18:28:58


Mark Ruzon wrote:
> Assume we have a range of objects of type tuple<T1,T2> and a function
> object that compares two objects of type T1. How would a person sort
> this range using this function object and bind? I want something
> along the lines of:
>
> std::sort(first, last, boost::bind<bool>(comp,
> boost::bind(boost::get<0>, _1),
> boost::bind(boost::get<0>, _2)));
>
> but this isn't remotely close to compiling. I could create a custom
> function object, but I'd rather learn how to use bind properly.

A very inconvenient question. :-)

In principle, when you want to use bind with a function template:

    template <typename T> int f( T const & x);

you supply its template parameters when binding it:

    bind( f<int>, _1 );

When you have several overloads:

    template <typename T> int f(const type1<T>& x);
    template <typename T> int f(const type2<T>& x);

you cast it to the correct type or use a function pointer:

    int (*pf)( const type2<int>& ) = &f;
    bind( pf, _1 );

Going by this logic:

    T1 const & (*get0)( tuple<T1, T2> const & ) = &boost::get<0>;

    std::sort(first, last, boost::bind<bool>(comp,
        boost::bind(get0, _1),
        boost::bind(get0, _2)));

This doesn't work, though. get<0> doesn't take a tuple, it actually takes a
cons<Head, Tail>, an implementation detail of tuple:

    T1 const & (*get0)( tuple<T1, T2>::inherited const & ) = &boost::get<0>;

This works under VC 8, at least. It doesn't link under VC 7.1; the compiler
doesn't instantiate the correct get<0>.

In conclusion... boost::get<> and boost::bind don't mix well. It would be
easier to just write a get0 function for your tuple type or even a function
object for the comparison.


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