|
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