[lambda] std::sort problem

Following code does not compile: sort(m_results->begin(), m_results->end(), lambda::_1->second > lambda::_2->second); where: m_result is type of std::vector<std::pair<const SomeClass*,double>* > vs2008 compiler says: error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided, see declaration of 'std::sort' but in lamda documentation there is similar example: sort(vp.begin(), vp.end(), *_1 > *_2); so what's wrong with my code? -- Michał Nowotka

AMDG Michał Nowotka wrote:
Following code does not compile:
sort(m_results->begin(), m_results->end(), lambda::_1->second > lambda::_2->second);
where:
m_result is type of std::vector<std::pair<const SomeClass*,double>* >
vs2008 compiler says:
error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided, see declaration of 'std::sort'
but in lamda documentation there is similar example:
sort(vp.begin(), vp.end(), *_1 > *_2);
so what's wrong with my code
Boost.Lambda doesn't overload operator-> because C++ doesn't allow it to work in general. You have to do it like this (lambda::_1->*&std::pair<const SomeClass*,double*>::second) using member pointers. In Christ, Steven Watanabe

Ok, but there is another problem. Suppose i defined: typedef MyType std::pair<const SomeClass*,double*>; So if I want to keep DRY i should write: lambda::_1 ->*&MyType::value_type::second > lambda::_2 ->*&MyType::value_type::second); I also tried: bind(&MyType::value_type::second, lambda::_1) > bind(&MyType::value_type::second, lambda::_2) but none of this expression works for me.

On Sun, Jan 25, 2009 at 9:46 AM, Michał Nowotka <mmmnow@gmail.com> wrote:
Ok, but there is another problem.
Suppose i defined: typedef MyType std::pair<const SomeClass*,double*>;
So if I want to keep DRY i should write:
lambda::_1 ->*&MyType::value_type::second > lambda::_2 ->*&MyType::value_type::second);
I also tried: bind(&MyType::value_type::second, lambda::_1) > bind(&MyType::value_type::second, lambda::_2)
but none of this expression works for me.
Shouldn't that be &MyType::second - std::pair has no value_type? Stuart Dootson

Right, there is a mistake. So the problem is: Suppose i defined: typedef std::vector<std::pair<const SomeClass*,double>* > MyType; So if I want to keep DRY i should write: lambda::_1 ->*&MyType::value_type::second > lambda::_2 ->*&MyType::value_type::second); I also tried: bind(&MyType::value_type::second, lambda::_1) > bind(&MyType::value_type::second, lambda::_2) but none of this expression works for me. -- Michał Nowotka

2009/1/25 Michał Nowotka <mmmnow@gmail.com>:
Right, there is a mistake.
So the problem is:
Suppose i defined: typedef std::vector<std::pair<const SomeClass*,double>* > MyType;
So if I want to keep DRY i should write:
lambda::_1 ->*&MyType::value_type::second > lambda::_2 ->*&MyType::value_type::second);
I also tried: bind(&MyType::value_type::second, lambda::_1) > bind(&MyType::value_type::second, lambda::_2)
but none of this expression works for me.
Well, it's hardly surprising, as the value_type of the vector is a pointer, so won't have a member called 'second'. Let's refactor the DRY-ness a little: typedef std::pair<const MyClass*,double> ElemType; typedef std::vector<ElemType *> MyType; MyType v; Then you can use this: std::sort(v.begin(), v.end(), bind(&ElemType::second, _1) > bind(&ElemType::second, _2)); ? Stuart Dootson
participants (3)
-
Michał Nowotka
-
Steven Watanabe
-
Stuart Dootson