проблемы с C ++ boost лямбда и == - оператор - PullRequest
1 голос
/ 11 января 2012

Есть:

template<typename T>
bool any(::Ref<Iterator<T> > i, boost::function<bool(T)> pred) {
    // ...
}

И:

template<typename T> struct Ref {
     // ...
};

template<typename T> struct Iterator {
     // ...
};

Тогда у меня такой вызов (какие ошибки):

int forworm = 42;
bool x = any<CWorm*>(worms(), (_1 ->* &CWorm::getID) == forworm)

И worms() возвращаетRef<Iterator<CWorm*> Ref> и int CWorm::getID(); (который является функцией-членом).

Это происходит из-за очень длинной ошибки о недопустимых операндах в двоичном выражении.Часть этого:

/ usr / local / include / boost / lambda / detail / operator_lambda_func_base.hpp: 222: 1: {222: 1-222: 63} {222: 1-222:63}: ошибка: недопустимые операнды в двоичном выражении ('typename lambda_functor_base>, tuple>, int (CWorm :: * const) () const, null_type, null_type, null_type, null_type, null_type, null_type, null_type, null_type>> ::sig> :: type '(он же' member_pointer_caller ') и' int ') [3]

Почему?

Как это исправить?

ЕслиЯ делаю это несколько более многословно, то есть не через лямбды, но я объявляю другую функцию вручную и использую boost::bind, она работает.Т.е. так:

static bool _wormIdEqual(CWorm* w, int wormId) {
    return w->getID() == wormId;
}

any<CWorm*>(worms(), boost::bind(_wormIdEqual, _1, forworm)))

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Вы должны быть в состоянии сделать это:

#include <boost/lambda/bind.hpp>

using boost::lambda::bind;
bool x = any<CWorm*>(worms(), bind(&CWorm::getID, _1) == forworm);

boost::lambda::bind(&CWorm::getID, _1) ведет себя так, как вы надеялись (_1 ->* &CWorm::getID), и может (лениво) сравнивать равенство с forworm. Так что это все еще лямбда-функция.

0 голосов
/ 11 января 2012

Цитата из Boost.Lambda Документация:

Лямбда-выражения, содержащие вызовы функций, управляющие структуры, броски и т. д. требуют специальных синтаксических конструкций. Самое главное, вызовы функций должны быть заключены в функцию связывания. Как Например, рассмотрим лямбда-выражение

Вы пытаетесь вызвать функцию в своем коде, поэтому вы должны использовать bind(), чтобы фактически отложить вызов функции. Более того, задерживает переменную / константу forworm:

int forworm = 42;
bool x = any<CWorm*>(worms(), bind(&CWorm::getID, _1) == var(forworm));

Этот ответ является улучшением ответа @Aaron McDaid, он слишком длинен для комментария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...