Есть:
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)))