boost lambda
От: johny5 Новая Зеландия
Дата: 06.09.07 15:52
Оценка:
Подскажите пожалуйста, что то не получается.

Нужно найти элемент в массиве, метод 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)

Re: boost lambda
От: _nn_ www.nemerleweb.com
Дата: 06.09.07 17:56
Оценка: 2 (1)
Здравствуйте, 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;
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: boost lambda
От: johny5 Новая Зеландия
Дата: 07.09.07 01:23
Оценка:
С 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;
}
Re[3]: boost lambda
От: ArtDenis Россия  
Дата: 07.09.07 08:13
Оценка:
johny5 пишет:
>
> А завести Boost.Lambda у меня так и не получилось. В документации ...

забыли
using boost::lambda::_1;
Posted via RSDN NNTP Server 2.1 beta
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: boost lambda
От: _nn_ www.nemerleweb.com
Дата: 07.09.07 08:32
Оценка:
Здравствуйте, johny5, Вы писали:

J>С Bind-ом заработало, это что то типа "новинка", я не знал.

здесь можно почитать про Boost.Bind и Boost.Lambda
В основном различие в том, что Boost.Lambda может немного больше
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: boost lambda
От: Sharp Eye Россия  
Дата: 07.09.07 09:44
Оценка: 2 (1)
Здравствуйте, 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;
}
Re[2]: boost lambda
От: johny5 Новая Зеландия
Дата: 07.09.07 13:12
Оценка:

SE>#include <boost/lambda/lambda.hpp>

SE>



ААА!! Вы правы, точно! Спасибо
Re[4]: boost lambda
От: Sergey Chadov Россия  
Дата: 08.09.07 11:02
Оценка: :)
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, johny5, Вы писали:


J>>С Bind-ом заработало, это что то типа "новинка", я не знал.

__>здесь можно почитать про Boost.Bind и Boost.Lambda
__>В основном различие в том, что Boost.Lambda может немного больше

Но немного реже ...
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.