Hi Mark,

On 1/11/07, Mark Ruzon <ruzon@cs.stanford.edu> 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)));



as Peter pointed out using overloaded function templates are a pain. However, if you define this one little get function (not even a functor) you may use it with bind easily:

template< int N,  class Tup > inline
typename boost::tuples::element<N,Tup>::type& get(Tup& t)
{
   return boost::tuples::get<N>(t);
}

Then, inside some scope where you can access this and bind arguments to your custom comparison functor

typedef boost::tuples::tuple<int,float> tup;
std::vector< tup > a(5);
namespace b = boost;
std::sort( a.begin(), a.end(),
   b::bind( mycompare, b::bind(get<0,tup>, ::_1), b::bind(get<0,tup>, ::_2) )
);


Now that you want to play around with these "beauties" (bind, tuple, etc..), here  is a piece of compiling (and working) code which you might find entertaining. It also uses Boost.Lambda to fill-up the tuple vector, print-it out and sort with an inline lambda expression in addition to boost::bind'ed externally crafted functor.
 

hth
- levent


--
Server Levent Yilmaz
Mechanical Engineering @ PITT