Re: Using boost::lambda with std::count_if
Content-Type: text/plain; charset=ISO-8859-1
X-Original-Date: Wed, 23 Jan 2008 11:29:52 -0800 (PST)
X-Submission-Address: c++-submit@netlab.cs.rpi.edu
francis_r wrote:
class User
{
public:
enum Status
{
Online,
Away
Offline
};
Status status() const;
[...]
};
And I have a vector:
std::vector<User> users;
Now I want to use count_if to count all users that have not the
Offline status. I can do this by writing a predicate function of
course but I think it would be nice to do this using a lambda
expression.
I can't figure out how to write the expression. Idealy it would look
something like this I think:
count_if(users.begin(), users.end(), lambda::_1.status() !=
User::Offline);
But that doesn't compile, as I expected.
The seemingly closest to "_1.status" would be
boost::lambda::_1->*&User::status
but the semantics of this expression is a bit odd, see
http://boost.org/doc/html/lambda/le_in_details.html#lambda.member_pointer_operator
Thus, you should use
boost::lambda::bind(&User::status,boost::lambda::_1)!=User::Offline
as the predicate.
Another question: suppose I do write following predicate functions:
[...]
bool Predicate_UserOffline(const User& user)
{ return user.status() == User::Offline; }
Is it then possible to count the users, using count_if, that are
either Online or Away? It would be !Predicate_UserOffline, but I can't
use that expression as a function pointer. I could use count_if two
times, once with Predicate_UserOnline and once with
Predicate_UserAway, and then the sum would be correct too. But I
wonder if it would be possible to use only one count_if statement.
Well, you could use
boost::lambda::bind(Predicate_UserOffline,boost::lambda::_1)!
=User::Offline
as a predicate but that's just an unnecessary indirection
compared to the predicate above.
Boost.Lambda lets you combine arbitrarily complex
expressions, you just need to be a bit careful. When
the C++ rules don't let you do something the intuitive
way, you can usually get around the problem with
boost::lambda::bind.
Cheers,
Vladimir
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]