2015-12-01 4 views
1

Я столкнулся с этим вопросом ptr_fun в одном из C++-кода, я пробовал читать его с cplusplus.com, но я честно не могу понять, что должен делать этот указатель функции.Я не понимаю ptr_fun

Код интереса очень прост, обрезает пустые части с начала строки.

static inline string & trim_beg(string & s) { 
    s.erase(s.begin(), find_if(s.begin(), s.end(), not1(ptr_fun < int, int > (isspace)))); 
    return s; 
} 
+8

http://en.cppreference.com/w/cpp/utility/functional/ptr_fun – Maxqueue

+2

Вам не нужно указывать аргументы шаблона, '' ptr_fun (:: isspace) 'должен делать. Единственная цель 'ptr_fun' - обернуть' isspace' и предоставить член 'typedef'' argument_type', который требуется ['unary_negate'] (http://en.cppreference.com/w/cpp/utility/functional/unary_negate) (вещь, которую 'not1' возвращает). Таким образом, вызов 'find_if' будет возвращать итератор в первый элемент, для которого'! Isspace' истинно. – Praetorian

ответ

2

С Эффективное STL (пункт 40) Скотт Мейерс:

Единственное ptr_fun делает сделать некоторые определения типов доступны. Это это. Эти typedefs требуются not1, и поэтому применение not1 к ptr_fun, но применение not1 to ... напрямую не работает. ... не хватает typedefs, который не требуется.

Это в основном тот же ответ, данный Praetorian в комментариях выше, но эффективный STL предоставляет более общее объяснение.

Смежные вопросы