Ricordate che il modo corretto di passare char
s per le funzioni di classificazione dei caratteri (insieme a toupper
e tolower
) che è venuto dalla libreria standard C è per convertirlo prima a unsigned char
e poi a int
.
Utilizzare std::ref
e uno reference_wrapper
per questo è leggero e sbagliato. L'utilizzo di std::function<bool(int)>
o std::function<bool(char)>
è più pesante e anche sbagliato. In tutti questi casi, lo char
nella stringa viene convertito direttamente in int
, che non è il modo giusto per farlo.
Se ti ostini a non usare un lambda, quindi
std::find_if(s.begin(), s.end(), std::not1(std::function<bool(unsigned char)>(::ispunct)));
è un modo giusto per farlo. Altrimenti
std::find_if(s.begin(), s.end(), [](unsigned char c) { return !ispunct(c); });
è più facile da capire - e più breve.
fonte
2015-03-24 17:33:59
Con la libreria Fondamentali v2 TS, 'std :: not_fn (:: ispunct)'. Si noti, tuttavia, che affinché questa chiamata sia sicura per qualsiasi stringa, i caratteri devono essere convertiti in 'char unsigned 'prima di essere passati in' ispunct'. – chris