Что плохого в этом использовании boost :: lambda :: bind?

Я пытаюсь использовать boost::lambda::bind() определить предикат, который я передаю find_if алгоритм в Boost.Range. В частности, я хочу найти вектор структур, чтобы найти первую запись, в которой конкретный член имеет указанное значение. Мой пример выглядит следующим образом:

#include <boost/lambda/bind.hpp>
#include <boost/range/algorithm/find_if.hpp>
#include <vector>

using namespace std;
using namespace boost;
using namespace boost::lambda;

struct foo
{
string s;
int x;
};

int main()
{
// create list and add a couple entries
vector<foo> fooList;
foo f1 = {"abc", 1};
foo f2 = {"def", 2};
fooList.push_back(f1);
fooList.push_back(f2);
// search for a value with the desired member
//     fails with a compile error!
range_iterator<vector<foo> > it = find_if(fooList, boost::lambda::bind(&foo::s, _1) == string("abc"));
return 0;
}

Когда я пытаюсь скомпилировать это (под gcc 4.7.2), я получаю типичный выброс ошибок при создании шаблона, указывая, что не было operator== найдено, что совместимо с типом, возвращаемым bind() и const char [], Я пробовал это с другими типами, такими как intс тем же результатом.

Должно быть, мне не хватает какой-то маленькой детали bind() использование, но я не вижу этого; кажется, что такого рода вещи должны работать на основе документации. Я ошибаюсь там?

Редактировать: Вот первая часть вывода компилятора:

test.cc:24:92: error: no match for ‘operator==’ in ‘boost::lambda::bind(const Arg1&, const Arg2&) [with Arg1 = std::basic_string<char> foo::*; Arg2 = boost::lambda::lambda_functor<boost::lambda::placeholder<1> >; typename boost::lambda::detail::bind_tuple_mapper<const Arg1, const Arg2>::type = boost::tuples::tuple<std::basic_string<char> foo::* const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>]((* & boost::lambda::{anonymous}::_1)) == "abc"’

4

Решение

Оказывается, я не включил требуемые заголовки. Похоже, что <boost/lambda/bind.hpp> только приносит в bind функциональные возможности и перегрузки оператора для результирующего типа не включены. Если я добавлю #include <boost/lambda/lambda.hpp> к вышеупомянутому, тогда это решает ошибку компилятора, на которую я ссылался. Окончательный пересмотренный код (исправление еще одной ошибки в типе возвращаемого значения из find_if()) как следует:

#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/range/algorithm/find_if.hpp>
#include <string>
#include <vector>

using namespace std;
using namespace boost;
using namespace boost::lambda;

struct foo
{
string s;
int x;
};

int main()
{
// create list and add a couple entries
vector<foo> fooList;
foo f1 = {"abc", 1};
foo f2 = {"def", 2};
fooList.push_back(f1);
fooList.push_back(f2);
// search for a value with the desired member
typename range_iterator<vector<foo> >::type it = find_if(fooList, bind(&foo::s, _1) == "abc");
return 0;
}
4

Другие решения

Других решений пока нет …