bind2nd
(§D.9) и ptr_fun
(§D.8.2.1) устарели в C ++ 11.Вы можете просто написать другую лямбда-функцию в find_if
:
auto pos = find_if(v1.begin(), v1.end(),
[&](const std::string& s) {
return !stringcasecmp(s, target);
});
ptr_fun(<lambda>)
не будет работать, потому что ptr_fun
предназначен для C ++ 03 для преобразования указателя на функциюобъект для других адаптеров.Лямбда уже является функциональным объектом, поэтому ptr_fun
не требуется.
bind2nd
ожидает, что функциональный объект определит элементы second_argument_type
и result_type
, что неверно для лямбды, поэтому написание bind2nd(<lambda>, target)
также не будет работать.Но в C ++ 11 есть универсальная замена, которая работает:
std::bind(stringcasecmp, std::placeholders::_1, target)
Однако bind
не возвращает объект функции в стиле C ++ 03, чего ожидает not1
: для этого требуетсятип результата bind
для определения argument_type
члена, который не существует.Поэтому окончательное выражение
std::not1(std::bind(stringcasecmp, std::placeholders::_1, target))
будет не работать.Самый простой обходной путь - просто используйте другую лямбду, которую я написал выше.
В качестве альтернативы, вы можете определить общий отрицатель:
template <typename Predicate>
struct generic_negate
{
explicit generic_negate(Predicate pred) : _pred(pred) {}
template <typename... Args>
bool operator()(Args&&... args)
{
return !_pred(std::forward<Args>(args)...);
}
private:
Predicate _pred;
};
template <class Predicate>
generic_negate<Predicate> not_(Predicate pred)
{
return generic_negate<Predicate>(pred);
}
....
auto pos = find_if(v1.begin(), v1.end(), not_(bind(stringcasecmp, _1, target)));
Пример: http://ideone.com/6dktf