Подскажите пожалуйста, что то не получается.
Нужно найти элемент в массиве, метод name которого равен определённой строке.
iterator p = find_if(container, bind(&Class::name, _1) == "conrete_id"));
ругается на bind:
error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const boost::lambda::lambda_functor<T>' (or there is no acceptable conversion)
Здравствуйте, johny5, Вы писали:
J>Подскажите пожалуйста, что то не получается.
J>Нужно найти элемент в массиве, метод name которого равен определённой строке.
J>J>iterator p = find_if(container, bind(&Class::name, _1) == "conrete_id"));
J>
J>ругается на bind:
J>J>error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const boost::lambda::lambda_functor<T>' (or there is no acceptable conversion)
Boost.Bind:
#include <algorithm>
#include <boost/bind.hpp>
#include <boost/assign/std.hpp>
#include <vector>
#include <string>
using boost::assign::operator+=;
struct a
{
a(std::string const& s) : s(s) {}
std::string s;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<a> q;
q += a("a"), a("b"), a("c");
std::vector<a>::iterator p = std::find_if(q.begin(), q.end(), boost::bind(&a::s, _1) == "b");
return 0;
}
С Bind-ом заработало, это что то типа "новинка", я не знал.
А завести Boost.Lambda у меня так и не получилось. В документации написано что лямбда перегружает все возможные операторы. Решил попробовать что-то из примеров документации, нашёл operator == в одном примере и он тоже не заработал.
for_each(a.begin(), a.end(), if_then(_1 % 2 == 0, cout << _1));
Ругается что
binary '%' : 'boost::lambda::placeholder1_type' does not define this operator ...
похоже бага.
вот, полный код
#include <algorithm>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/if.hpp>
#include <vector>
int _tmain(int argc, _TCHAR* argv[])
{
using namespace boost::lambda;
std::vector<int> q;
std::for_each( q.begin(), q.end(), if_then(_1 % 2 == 0, _1) );
return 0;
}
johny5 пишет:
>
> А завести Boost.Lambda у меня так и не получилось. В документации ...
забыли
using boost::lambda::_1;
Posted via RSDN NNTP Server 2.1 beta
Здравствуйте, johny5, Вы писали:
J>С Bind-ом заработало, это что то типа "новинка", я не знал.
здесь можно почитать про Boost.Bind и Boost.Lambda
В основном различие в том, что Boost.Lambda может немного больше
Здравствуйте, johny5, Вы писали:
J>Подскажите пожалуйста, что то не получается.
J>Нужно найти элемент в массиве, метод name которого равен определённой строке.
J>J>iterator p = find_if(container, bind(&Class::name, _1) == "conrete_id"));
J>
J>ругается на bind:
J>J>error C2678: binary '==' : no operator found which takes a left-hand operand of type 'const boost::lambda::lambda_functor<T>' (or there is no acceptable conversion)
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <algorithm>
#include <vector>
#include <string>
class Class
{
std::string name_;
public:
Class()
{}
Class(const std::string & Name)
: name_(Name)
{}
const std::string & name()
{
return name_;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<Class> v(3);
v[0] = Class("Class 0");
v[1] = Class("Class 1");
v[2] = Class("Class 2");
using namespace boost::lambda;
std::vector<Class>::iterator it = find_if(v.begin(), v.end(),
bind(&Class::name, _1) == "Class 1");
std::cout << it->name() << std::endl;
return 0;
}
SE>#include <boost/lambda/lambda.hpp>
SE>
ААА!! Вы правы, точно! Спасибо
Здравствуйте, _nn_, Вы писали:
__>Здравствуйте, johny5, Вы писали:
J>>С Bind-ом заработало, это что то типа "новинка", я не знал.
__>здесь можно почитать про Boost.Bind и Boost.Lambda
__>В основном различие в том, что Boost.Lambda может немного больше
Но немного реже ...

--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>